Получение уведомлений, когда клиент неожиданно закрывается в JBoss Netty - PullRequest
0 голосов
/ 08 ноября 2011

Есть ли на стороне сервера Netty прослушиватель, который будет уведомлен, когда клиент неожиданно закрывается (скажем, когда удален кабель локальной сети в клиенте m / c). Ни один из методов в DefaultChannelHandler не вызывается. Предположим, что клиент неактивен (не отправляет / не получает никаких данных), когда кабель ЛВС был отключен.

Или мы должны внедрить монитор Keep-Alive на стороне сервера, чтобы проверить, действителен ли канал?

Ответы [ 3 ]

2 голосов
/ 08 ноября 2011

Практически, нет способа обнаружить неожиданно оборванное соединение в TCP / IP. Если есть способ сделать это, его не следует называть «неожиданно». : -)

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

Для реализации этого поведения вы можете использовать IdleStateHandler. Вставьте его в свой конвейер и сделайте так, чтобы ваш обработчик расширил IdleStateAwareChannelHandler или IdleStateAwareChannelUpstreamHandler.

В качестве альтернативы, если клиенты и серверы работают в хорошо управляемой сети, такой как ЛВС, вы можете настроить свою операционную систему так, чтобы она чаще отправляла пакеты поддержания активности TCP. Для получения дополнительной информации см. TCP keepalive HOWTO . Однако я сомневаюсь, что это будет надежно работать в среде WAN. (Если кто-то экспериментировал с тайм-аутом активности активности TCP в среде WAN, поделитесь своей историей.)

0 голосов
/ 15 ноября 2011

Разработан и внедрен отказоустойчивый keep-alives. Здесь важно закрыть канал после тайм-аута и снова открыть его.

0 голосов
/ 10 ноября 2011

Вы пытались добавить ReadTimeoutHandler в свой конвейер?Я полагаю, что это выдаст ReadTimeoutException после того, как сервер не прочитал данные из канала в течение заданного количества секунд.

Я использовал это только на клиентах для осуществления повторного соединения (как пример UpTime),но это может также сработать и здесь.

...