如何确保 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 连接的安全