使用PING / PONG检测半开式WebSocket

时间:2019-02-12 15:26:12

标签: jetty jetty-9

我将Jetty 9.2.24用作WebSocket服务器。我想检测半开连接,以便不再有更多消息通过该连接发送并缓冲。

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

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

1 个答案:

答案 0 :(得分:0)

  

请注意,Jetty 9.2.x is EOL (End of Life)应该考虑升级。

设置最大空闲超时,然后通过发送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帧或强行断开连接,使服务器立即结束对话)