Как вы справляетесь с разъединением сокета в Java? - PullRequest
13 голосов
/ 28 января 2009

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

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

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

Ответы [ 3 ]

12 голосов
/ 28 января 2009

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

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

4 голосов
/ 28 января 2009

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

0 голосов
/ 09 августа 2016

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

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

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

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

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

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

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