使用PING / PONG检测半开腹网

问题描述 投票:0回答:1

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

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

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

jetty jetty-9
1个回答
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帧(导致半开连接)。所以半开只是在活动消息的持续时间内,然后是关闭。如果没有消息处于活动状态,则立即发生CLOSE。

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

© www.soinside.com 2019 - 2024. All rights reserved.