Сервер, обнаруживший клиента, теряющего соединение из сокета - PullRequest
1 голос
/ 14 мая 2011

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

Я предполагаю, что один из методов будет иметь своего рода сердцебиение, опрашивающее клиента, но есть ли более простой / легкий способ?

Ответы [ 2 ]

3 голосов
/ 15 мая 2011

Есть несколько способов, в зависимости от того, что вы считаете «сбоем».

Если клиентский процесс умирает, клиентская ОС закроет сокет.Сервер может обнаружить это, выполнив read(), который либо возвратит -1 (EOF), либо увеличит SocketException («сброс соединения»).

Если клиент попадает в бесконечный цикл,связь останется открытой;единственный способ обнаружить это - включить какое-то «сердцебиение» в ваш протокол.

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

  • протокол имеет механизм "сердцебиения", как описано выше, с некоторым таймаутом, или
  • В сокете включена поддержка активности TCP по вызову socket.setKeepAlive(true) - это указывает ОС периодически * отправлятьпакет для проверки того, что удаленный конец соединения активен, закрытие соединения, если не

*, для Windows и Linux по умолчанию установлено значение 2 часа;Вы можете изменить это для всей системы, но не для каждого сокета (во всяком случае, под Java)

0 голосов
/ 14 мая 2011

TCP-сокеты в любом случае делают это, и Java предоставляет их разработчику. См. setKeepAlive() / getKeepAlive() в классе Socket. Если сообщение TCP не отправляется от клиента к серверу в течение определенного периода времени, сокет закроется, и сервер сможет удалить информацию о сеансе, поскольку у него все еще есть конечная точка.

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