Настроить сокет Java для быстрого отказа при отключении? - PullRequest
3 голосов
/ 22 августа 2008

У меня есть порт прослушивания на моем сервере, к которому я подключаюсь с использованием класса Java и интерфейса Socket, т.е.

Socket mySocket = new Socket(host,port);

Затем я беру OutputStream, украшаю PrintWriter в режиме автозапуска и смеюсь - за исключением случаев, когда порт прослушивания закрывается. Тогда я получаю

tcp4       0      0  *.9999                 *.*                    LISTEN
tcp        0      0  127.0.0.1.45737        127.0.0.1.9999         CLOSE_WAIT

и я не могу обнаружить проблему в программе - я пытался использовать метод isConnected() в сокете, но, похоже, он не знает, что соединение закрыто.

Я хочу знать о проблеме в следующий раз, когда я попытаюсь написать в Socket, чтобы я мог попытаться повторно подключиться и сообщить о проблеме.

Любой совет, пожалуйста?

Спасибо всем

Ответы [ 3 ]

0 голосов
/ 29 сентября 2008

Установить другой поток для чтения из сокета. Он будет блокироваться до тех пор, пока сокет не будет закрыт, а затем будет выдано исключение. Поймайте это исключение, чтобы немедленно обнаружить закрытие.

0 голосов
/ 23 февраля 2014

Единственный надежный способ обнаружения разорванного соединения в TCP - это запись в него, что в итоге вызовет IOException «сброс соединения». Однако из-за буферизации это не произойдет при первой записи после отключения, p, но при последующей записи. С этим ничего не поделаешь.

0 голосов
/ 22 августа 2008

Установить короткий тайм-аут?

Неужели isOutputShutdown() не дает вам то, что вы хотите?

Вы всегда можете создать класс SocketWatcher, который раскручивается в своем собственном Thread и неоднократно пытается записать пустые строки в Socket, пока он не вызовет SocketClosedException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...