【问题标题】:How to ensure that readyState of a WebSocket has turned to CLOSED (3)?如何确保 WebSocket 的 readyState 变为 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 处理程序。

标签: javascript websocket


【解决方案1】:

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

那绝不能发生。来自the spec

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 2017-08-21
    • 2019-10-28
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    相关资源
    最近更新 更多