У вас могут быть две проблемы: PrintWriter
- странный зверь в мире Java Stream
/ Reader
/ Writer
, в котором он проглатывает исключения и требует от вас явной проверки на наличие ошибок.
Единственное использование для этого (на мой взгляд) - стандартные потоки (System.out
и System.err
), где сбой записи вывода не должен останавливать приложение (например, если нет стандартного вывода).
Замените его на OutputStreamWriter
, и вы получите уведомление об ошибках, как только Java узнает о них.
Это подводит меня ко второй возможной проблеме: TCP / IP не имеет автоматических пакетов поддержки активности: поэтому если ваше соединение каким-либо образом разорвано, вы на самом деле не заметите его, пока Вы пытаетесь отправить данные.
Так что, если вы подключитесь к некоторому сокету, отправите несколько пакетов, подождите немного и , а затем отключитесь, вы будете уведомлены о том факте только при следующей попытке отправить некоторые данные. Это присуще протоколу TCP / IP и не является ошибкой Java.
Если вы хотите уменьшить проблему, вы можете отправлять периодические сообщения keep-alive / ping без какого-либо действительного эффекта, за исключением того, что они проверяют, все ли соединение еще живо.