Подтвердить что ты не робот

Как вы обрабатываете Socket Disconnecting в Java?

Эй, все. У меня есть сервер, написанный в java, используя классы ServerSocket и Socket.

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

Какова надлежащая процедура обнаружения отключений клиентов, закрытия сокета и последующего приема новых клиентов?

4b9b3361

Ответ 1

Предположительно, вы читаете из сокета, возможно, используя обертку поверх входного потока, например BufferedReader. В этом случае вы можете определить конец потока, когда соответствующая операция чтения возвращает -1 (для вызовов raw read()), или null (для вызовов readLine()).

Некоторые операции вызовут SocketException при выполнении в закрытом сокете, с которым вам также необходимо будет иметь дело соответствующим образом.

Ответ 2

Единственный безопасный способ обнаружить другой конец - это периодически посылать пульс и иметь другой конец таймаута, основанный на отсутствии сердечного ритма.

Ответ 3

Это только я, или никто не заметил, что JavaDoc указывает метод под ServerSocket api, который позволяет нам получить логическое значение на основе закрытое состояние serverocket?

вы можете просто зацикливать каждые несколько секунд, чтобы проверить его состояние:

if(!serverSocket.isClosed()){
  // whatever you want to do if the serverSocket is connected
}else{
  // treat a disconnected serverSocket
}

РЕДАКТИРОВАТЬ: просто повторив свой вопрос, кажется, что сервер требует постоянного поиска соединений, и если клиент отключается, он должен иметь возможность повторно обнаруживать, когда клиент пытается повторно подключиться. не должно ли это быть вашим решением в первую очередь?

У сервера, который прослушивает, как только он забирает клиентское соединение, он должен передать его объекту рабочего потока и запустить его для работы асинхронно. Затем сервер может просто вернуться к прослушиванию новых подключений. Если клиент отключается, запущенный поток должен умереть, и при его повторном подключении новый поток снова запускается для обработки нового соединения.

Jenkov является отличным примером этой реализации.