我将Jetty 9.2.24用作WebSocket服务器。我想检测半开连接,以便不再有更多消息通过该连接发送并缓冲。
我知道PING / PONG帧用于此目的,因此我尝试定期发送PING并设置较低的maxIdleTimeout。我修改了我的客户端,使其不返回PONG,以查看Jetty是否会将其视为失败的连接,因为RFC-6455规范规定远程端点必须以PONG进行响应。显然,Jetty无法检测到丢失的PONG,或者我做错了事。
最好的继续方法是什么。我是否应该通过显式接收所有PONG消息并检测超时来自己实现PING / PONG超时?我认为这是底层websocket管理框架的职责。
答案 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帧或强行断开连接,使服务器立即结束对话)