如何确保 WebSocket 的 readyState 变为 CLOSED(3)?

Posted

技术标签:

【中文标题】如何确保 WebSocket 的 readyState 变为 CLOSED(3)?【英文标题】:How to ensure that readyState of a WebSocket has turned to CLOSED (3)? 【发布时间】:2014-06-05 15:43:10 【问题描述】:

假设有一个 websocket 创建如下:

var ws = new WebSocket(url);

此外,假设通过此 Web 套接字进行的通信也可以正常工作。

已发现使用以下方法关闭此 WebSocket 会将其 readyState 设置为 CLOSING (2),但它永远不会达到 readyState CLOSED (3)

ws.close();

问题: - 当这发生在 onmessage 事件中时,由于 WebSocket 连接还没有关闭,所以会继续命中。如何确保其关闭状态,以使 onmessage 停止命中?

WebSocket readState 读取:https://developer.mozilla.org/en-US/docs/Web/API/WebSocket

【问题讨论】:

你遇到过这种行为吗?我无法确认“onmessage 事件持续触发,因为 WebSocket 连接尚未关闭 是的。我遇到了这个问题。 WebSocket 连接处于“正在关闭”状态。我不确定它是如何从“Closing”变成“Closed”的。 所有浏览器都会出现这种情况吗?你到底需要这个做什么?快速修复:将 if (this.readyState!=1) return; 添加到您的 onmessage 处理程序。 【参考方案1】:

onmessage 事件持续触发,因为 WebSocket 连接尚未关闭。

那绝不能发生。来自the spec:

当接收到 WebSocket 消息时 […],[并且]如果 readyState 属性的值不是 OPEN,则中止 [任何进一步的] 步骤。

如果您的套接字的就绪状态已经是CLOSING,它将不再发出任何message 事件。

readyState 设置为CLOSING,但它永远不会到达CLOSED

这对我来说意味着connection is not properly closed。尤其是,这种情况似乎发生在关闭握手已经开始,但服务器没有响应关闭控制帧时。

【讨论】:

以上是关于如何确保 WebSocket 的 readyState 变为 CLOSED(3)?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 TLS/SSL 确保 WebSocket 连接的安全

如何使用 TLS/SSL 确保 WebSocket 连接的安全

验证 WebSocket 连接

如何确保在页面卸载之前始终调用代码

websocket小程序开发测试环境可以,但是真机模式失败的原因解答

颤振的网络套接字