Настроить Java-сокет на быстрый сбой при отключении?
-
09-06-2019 - |
Вопрос
У меня есть порт прослушивания на моем сервере, к которому я подключаюсь с помощью класса 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()
метод в сокете, но, похоже, он не знает, что соединение закрыто.
Я хочу быть в курсе проблемы при следующей попытке записи в сокет, чтобы я мог попытаться повторно подключиться и сообщить о проблеме.
Какой-нибудь совет, пожалуйста?
Спасибо всем
Решение
Установить короткий тайм-аут?
Делает isOutputShutdown()
не могу дать тебе то, что ты хочешь?
Вы всегда могли бы построить SocketWatcher
класс, который вращается в своем собственном Thread
и неоднократно пытается записать пустые строки в Socket
до тех пор, пока это не вызовет SocketClosedException
.
Другие советы
Единственный надежный способ обнаружить разорванное соединение в TCP - это выполнить запись в него, что в конечном итоге вызовет исключение IOException 'connection reset'.Однако из-за буферизации это произойдет не при первой записи после отключения,p, а при последующей записи.Ты ничего не можешь с этим поделать.
Установите другой поток для чтения из сокета.Он будет блокироваться до тех пор, пока сокет не будет закрыт, а затем будет выдано исключение.Перехватите это исключение, чтобы немедленно обнаружить закрытие.