可靠的WebSocket连接状态检测

7

我一直在寻找一种可靠的WebSocket连接恢复机制。

经过一些调查,我发现一种方法是向服务器发送心跳(ping/pong),并检查在有限时间内是否收到了完整的pong

因此,如果连接实际上断开或速度非常慢,则会在pong等待超时时被视为断开连接,代码应该调用WebSocket.close()

归根结底,我提出这个问题是为了验证使用WebSockets实现连接-重新连接工作流程的正确性和可靠性,并检查是否有遗漏。

也就是说,我的问题是,这是实现WebSocket重新连接机制的正确和可靠的工作流程吗?

1个回答

4
websocket协议定义了特殊的ping和pong控制帧,但是它们无法通过JavaScript API访问。但是如果服务器发送这些帧,浏览器将会回应。
然而,如果连接突然中断并变成半开放状态的连接,虽然服务器会检测到,但浏览器不会。因此,我想在应用程序级别发送自己的ping不是一个坏主意。
回答你的问题,是的,这是一个好主意,因为如果连接变为半开放状态,你的客户端将无法获取更新,因为它认为已经连接。在websocket中,客户端必须初始化连接,所以即使浏览器意识到断开连接,它也无法重新连接。

是的,你说得对(并且感谢你的“确认”)。顺便说一句,在移动使用情况下,每20秒发送ping会对电池产生影响。在我的情况下,由于我不是为用户输入使用WebSockets,而是为服务器推送使用,所以我想尽快通知用户连接存在问题。 - Matías Fidemraizer
2
您可以通过发送带有时间戳的ping并让服务器在pong中回显来检测网络延迟。但是,如果通信被切断(即:没有正确的TCP终止),除非您尝试发送某些内容,否则很难说它已经被切断:http://blog.stephencleary.com/2009/05/detection-of-half-open-dropped.html - vtortola
@vtrola 这是一篇非常有趣的文章(为什么不将其作为参考添加到您的答案中呢?)。顺便说一下,我不确定是否理解了检测丢失连接的正确方法的第一个解决方案。我理解它是关于发送空消息(保持活动消息),并等待一段时间,如果在某个时间内没有收到响应,则认为连接已经丢失。 - Matías Fidemraizer
据我所知,这意味着您每隔一段时间发送一个保持活动的消息,如果服务器在一段时间内没有收到您的此类消息,则服务器将断开连接。同时,如果客户端未能发送该消息,则客户端可以认为连接已断开。我在答案中添加了链接。 - vtortola
但是如果我们需要定义客户端未能发送消息,我们需要说“它在有限的时间间隔内没有发送消息”。我错了吗? - Matías Fidemraizer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接