Есть несколько способов, в зависимости от того, что вы считаете «сбоем».
Если клиентский процесс умирает, клиентская ОС закроет сокет.Сервер может обнаружить это, выполнив read()
, который либо возвратит -1 (EOF), либо увеличит SocketException
(«сброс соединения»).
Если клиент попадает в бесконечный цикл,связь останется открытой;единственный способ обнаружить это - включить какое-то «сердцебиение» в ваш протокол.
Если хост клиента перезагружается или разрывается сетевое соединение, сервер может не заметить, если:
- протокол имеет механизм "сердцебиения", как описано выше, с некоторым таймаутом, или
- В сокете включена поддержка активности TCP по вызову
socket.setKeepAlive(true)
- это указывает ОС периодически * отправлятьпакет для проверки того, что удаленный конец соединения активен, закрытие соединения, если не
*, для Windows и Linux по умолчанию установлено значение 2 часа;Вы можете изменить это для всей системы, но не для каждого сокета (во всяком случае, под Java)