Обнаружение полуоткрытых веб-розеток с помощью PING / PONG - PullRequest
0 голосов
/ 12 февраля 2019

Я использую Jetty 9.2.24 в качестве сервера WebSocket.Я хочу обнаружить полуоткрытые соединения, чтобы больше сообщений не отправлялось по этому соединению и вместо этого буферизовалось.

Я знаю, что для этого используются кадры PING / PONG, поэтому я попытался периодически отправлять PING и установил низкий уровень.maxIdleTimeout.Я изменил свой клиент, чтобы НЕ возвращать PONG, чтобы посмотреть, будет ли Jetty расценивать это как сбойное соединение, поскольку спецификация RFC-6455 требует, чтобы удаленная конечная точка ДОЛЖНА отвечать PONG.Очевидно, Jetty не обнаруживает отсутствующие PONG, или я делаю что-то не так.

Каков наилучший способ продолжить.Должен ли я сам устанавливать таймауты PING / PONG, явно получая все сообщения PONG и определяя таймаут?Я думаю, что это будет ответственностью базовой структуры управления websocket.

1 Ответ

0 голосов
/ 12 февраля 2019

Обратите внимание, что Jetty 9.2.x - это EOL (End of Life) , вам следует подумать об обновлении.

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

В спецификации сказано, что когда вы получаете PING, вы должны отправить PONG , и Jetty действительно делает это.

Это не говорит о том, что получение PONG , или не получение PONG, или получение незапрашиваемого PONG имеет какое-то значение или поведение, как вы думаете.

Веб-сокет Jetty 9.4 будет держать полуоткрытое соединение открытым только достаточно долго, чтобы завершить текущее сообщение (независимо от того, сколько кадров оно занимает), а затем ответить на ЗАКРЫТЫЙ кадр, который он получил (который вызвал полуоткрытое соединение).Таким образом, полуоткрытое только на время активного сообщения, затем ЗАКРЫТО.Если никакое сообщение не активно, то ЗАКРЫТИЕ происходит немедленно.

На Jetty 9.4 вы также можете добавить WebSocketFrameListener и ответить соответствующим образом на основе полученных кадров (например: заставить сервер немедленно завершить разговор, либо черезЗАКРЫТЬ рамку или резко отключить)

...