Настроить сокет Java для быстрого отказа при отключении?

У меня есть порт прослушивания на моем сервере, к которому я подключаюсь, используя класс 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, чтобы я мог попытаться повторно подключиться и сообщить о проблеме.

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

Спасибо всем

22.08.2008 15:58:13
Метод isConnected () сообщает вам, подключали ли вы когда-либо этот сокет. Он не говорит вам о состоянии соединения.
user207421 22.02.2014 22:41:56
3 ОТВЕТА
РЕШЕНИЕ

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

Не isOutputShutdown()получается, что ты хочешь?

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

0
23.08.2008 12:50:06
Нет, isOutputShutdown () не дает ему то, что он хочет, и при этом не делает короткий тайм-аут или попытку получить исключение SocketClosedException, которого даже не существует. Вы путаете состояние сокета с состоянием соединения. -1
user207421 22.02.2014 22:40:38

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

-2
29.09.2008 01:12:52
Возможно, что TCP-соединение не может быть установлено способом, который не может быть обнаружен чтением.
user207421 22.02.2014 22:44:41

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

0
22.02.2014 22:47:06