使用 PING/PONG 检测半开 websockets

Detect half-open websockets with PING/PONG

我使用 Jetty 9.2.24 作为 WebSocket 服务器。我想检测半开连接,以便不再通过此连接发送消息并改为缓冲。

我知道 PING/PONG 帧用于此目的,因此我尝试定期发送 PING 并设置较低的 maxIdleTimeout。我将我的客户端修改为 NOT return a PONG 以查看 Jetty 是否会将此视为失败的连接,因为 RFC-6455 规范规定远程端点必须以 PONG 响应。显然 Jetty 没有检测到丢失的 PONG 或者我做错了什么。

继续的最佳方式是什么。我是否应该通过显式接收所有 PONG 消息并检测超时来自己实现 PING/PONG 超时?我认为这是底层 websocket 管理框架的责任。

Note that Jetty 9.2.x is EOL (End of Life) you should consider upgrading.

设置最大空闲超时然后通过发送 ping/pong 使连接不空闲并不理想。

规范说,当您 receive a PING you must send a PONG 时,Jetty 确实做到了。

它并没有说 receiving a PONG,或者没有收到 PONG,或者收到未经请求的 PONG 有任何你认为应该的意义或行为。

Jetty 9.4 websocket 只会保持半开连接打开足够长的时间来完成当前消息(无论需要多少帧)然后响应它收到的 CLOSE 帧(导致半开连接) .所以半开只是在活动消息的持续时间内,然后关闭。如果没有消息处于活动状态,则立即关闭。

在 Jetty 9.4 上,您还可以添加一个 WebSocketFrameListener 并根据收到的帧做出相应的响应(例如:让服务器立即结束对话,通过 CLOSE 帧或强行断开连接)