Я пытаюсь определить, закрыл ли клиент соединение сокета от netty. Есть ли способ сделать это?TCP keep-alive, чтобы определить, отключен ли клиент в netty
ответ
В обычном случае, когда клиент закрывает сокет через close()
, и соединение подтверждения TCP было успешно завершено, произойдет событие channelInactive()
(или channelClosed()
в 3).
Однако, в необычном случае, когда клиентская машина отключается из-за сбоя питания или отсоединенного сетевого кабеля, это может занять много времени, пока вы не обнаружите, что соединение было фактически отключено. Чтобы обнаружить эту ситуацию, вам нужно периодически отправлять сообщение клиенту и ожидать получения ответа в течение определенного времени. Это похоже на ping - вы должны определить периодическое сообщение ping и pong в своем протоколе, который практически ничего не делает, кроме проверки работоспособности соединения.
В качестве альтернативы вы можете включить SO_KEEPALIVE
, но интервал между этими параметрами обычно зависит от ОС, и я бы не рекомендовал его использовать.
Чтобы помочь пользователю реализовать подобное поведение относительно легко, Netty предоставляет ReadTimeoutHandler
. Настройте свой конвейер так, чтобы ReadTimeoutHandler
вызывал исключение, когда нет входящего трафика в течение определенного времени, и закрывайте соединение с исключением в вашем методе обработчика exceptionCaught()
. Если вы являетесь участником, который должен послать периодическое сообщение ping, используйте таймер (или IdleStateHandler
), чтобы отправить его.
Это зависит от вашего протокола, что вы используете ontop netty. Если вы создадите его для поддержки сообщений, подобных ping, вы можете просто отправить эти сообщения. Кроме того, netty - всего лишь довольно тонкая оболочка вокруг TCP.
Также см. this SO post, который описывает isOpen()
и связанные с ним. Однако это не решает проблему сохранения жизни.
Если вы пишете сервер, а netty - ваш клиент, то ваш сервер может обнаружить отключение, вызвав select()
или эквивалент, чтобы определить, когда сокет читается, а затем позвонить recv()
. Если recv()
возвращает 0, то сокет был закрыт изящно клиентом. Если recv()
возвращает -1, то отметьте errno
или эквивалент фактической ошибки (за небольшим исключением, большинство ошибок следует рассматривать как несравнимое отсоединение). Дело в неожиданных разъединениях заключается в том, что они могут занять много времени для обнаружения ОС, поэтому вам придется либо включить поддержку TCP-авитов, либо потребовать от клиента отправки данных на сервер на регулярной основе. Если ничего не получено от клиента в течение определенного периода времени, просто предположите, что клиент ушел и закрыл конец вашего соединения. Если клиент хочет, он может снова подключиться.
Я думаю, что вы неправильно поняли вопрос. Кажется, он использует Netty на сервере. – EJP
Если вы прочитали соединение, которое было закрыто одноранговым узлом, вы получите указание конца потока в зависимости от API. Если вы пишете на такое соединение, вы получите IOException: «reset connection». TCP не предоставляет другого способа обнаружения закрытого соединения.
TCP keep-alive (a) отключен по умолчанию и (b) работает только каждые два часа по умолчанию при включении. Это, вероятно, не то, что вы хотите. Если вы используете его, и вы читаете или записываете после того, как обнаружили, что соединение нарушено, вы получите ошибку сброса выше,
В Windows 2000 и более поздних версиях вы можете запрограммировать заданный интервал поддержки TCP для каждого соединения на основе «WSAIoctl (SIO_KEEPALIVE_VALS)». –
- 1. netty tcp bytebuffer сервер и клиент
- 2. KeepAlive с WCF и TCP?
- 3. java tcp сокеты проверить клиент отключен
- 4. Apache MaxClients, когда KeepAlive отключен
- 5. C# tcp socket keepalive
- 6. Как обрабатывать TCP keepalive в приложении
- 7. Требуется ли TCP Keepalive для занятого TCP-сокета?
- 8. Определение того, был ли отключен поток TCP
- 9. Настройка TCP keepalive после принятия
- 10. Является ли TCP Keepalive единственным механизмом для определения неработающей ссылки?
- 11. Как реализовать TCP KeepAlive в VB.NET на TCP-сервере (сокет)
- 12. TCP, функция recv висит, несмотря на KEEPALIVE
- 13. Как проверить, отключен ли клиент?
- 14. Клиент отключен
- 15. Netty TCP push/streaming server
- 16. Включить Tcp Keepalive в Windows CE 6.0
- 17. Singleton bootstrap и pipFactory на Netty как клиент Tcp
- 18. Netty server - медленный потребитель по TCP
- 19. Netty TCP Socket Overhead
- 20. Netty WebSockets & tcp socket
- 21. Полученное сообщение TCP Netty получено
- 22. netty Клиент транспорта файлов
- 23. Клиент Netty не подключился
- 24. Как определить, отключен ли iphone
- 25. Как определить, отключен ли AsyncContext?
- 26. Как определить, когда клиент telnet неправильно закрыт на tcp-сервере?
- 27. Можно ли активировать TCP KeepAlive на IOS устройств Apple,
- 28. HAProxy закрывает длинные живые TCP-соединения, игнорируя TCP keepalive
- 29. Поддерживает ли TCP keepalive время ожидания на NAT?
- 30. PHP-клиент-клиент TCP-клиентов
Ответы в этой ссылке в основном неверны. В SO есть намного лучшие ответы. – EJP
@EJP У вас есть ссылка? Если бы вы могли предложить редактирование, я с радостью соглашусь с этим! –
Мое понимание заключается в том, что tcp имеет встроенный встроенный модуль. Нельзя ли использовать это? –