Похоже, проблема сети - возможно, перегруженная связь или сломанный межсетевой экран между двумя хостами. «Воспроизведение» проблемы путем добавления задержек к клиенту не скажет вам ничего интересного, только то, что буферизация на уровне ОС работает так, как задумано:)
Вам необходимо выяснить, почему пакеты задерживаются, что обычно означает tcpdump / wireshark на обоих концах. Если проблема возникает только каждые несколько месяцев, тогда это, вероятно, излишне - сфокусируйтесь на улучшении того, как приложение обрабатывает этот сценарий и / или как вы обнаруживаете, повторяется ли оно.
Кроме того, Java не позволяет устанавливать тайм-аут записи, поэтому для восстановления из этого сценария reader должен вызвать setSoTimeout
перед чтением, а затем закрыть сокет, если при чтении выбрасывается SocketTimeoutException
. В этом случае запись должна завершиться с ошибкой SocketException
(«сброс соединения по одноранговому узлу»), хотя это может занять некоторое время, если соединение медленное / прерывистое.