可靠的 WebSocket 连接状态检测

Posted

技术标签:

【中文标题】可靠的 WebSocket 连接状态检测【英文标题】:Reliable WebSocket connection state detection 【发布时间】:2014-07-07 08:14:26 【问题描述】:

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

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

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

最后,我问这个问题是为了验证使用 WebSockets 的连接重新连接工作流,并检查我是否遗漏了什么。

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

【问题讨论】:

【参考方案1】:

websocket 协议为 ping 和 pong 定义了特殊的控制帧,但它们不能通过 javascript API 访问。但是如果服务器发送这些帧,浏览器就会响应。

但是,如果连接突然断开并变成half-open connection,虽然服务器会检测到它,但浏览器不会。所以我想在应用程序级别发送你自己的 ping 并不是一个坏主意。

回答您的问题是的,这是个好主意,因为如果连接打开一半,您的客户端将不会获得更新,因为他认为它已连接。在websocket中,客户端要发起连接,所以即使浏览器意识到断开连接,也无法重新连接。

【讨论】:

是的,您是对的(感谢您的“确认”)。顺便说一句,有移动用例,例如每 20 秒发送一次 ping 对电池有影响。就我而言,由于我没有使用 WebSockets 进行用户输入,而是使用服务器推送,因此我想尽快通知用户连接出现问题。 您可以通过发送带有时间戳的 ping 并让服务器在 pong 中回显它来检测网络延迟。但是如果通信被切断(即:没有适当的 TCP 终止),很难说它被切断了,直到你尝试发送一些东西:blog.stephencleary.com/2009/05/… @vtrola 这是一篇非常有趣的文章(为什么不将它添加到您的答案中作为参考?)。顺便说一句,我不确定我是否理解检测断开连接的正确方法的第一个解决方案。我理解是发送一个空消息(keepalive消息),并等待有限的时间,如果一段时间没有收到响应,则认为连接丢失。 据我了解,意思是你每X次发送一个keepalive消息,如果服务器在一段时间内没有为你收到这样的消息,服务器就会断开连接。同时,如果客户端发送消息失败,客户端可以考虑断开连接。我添加了答案的链接。 但是如果我们需要定义客户端发送消息失败,我们需要说“它没有在有限的时间间隔内发送消息*。我错了吗?

以上是关于可靠的 WebSocket 连接状态检测的主要内容,如果未能解决你的问题,请参考以下文章

检测到动作电缆的连接状态

HTML5 websocket 客户端未检测到意外的服务器断开连接

WebSocket 心跳检测和重连机制

维护websocket长链接的稳定

WebSocket对象的“readyState”属性记录连接过程中的状态值

python websocket客户端连接状态 - 如何更新以获得正确的状态?