Firefox 在连接错误时不会立即关闭 WebSocket?

Posted

技术标签:

【中文标题】Firefox 在连接错误时不会立即关闭 WebSocket?【英文标题】:Firefox doesn't close WebSocket immediately on connection error? 【发布时间】:2019-12-31 21:38:51 【问题描述】:

我有这个演示代码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  </head>
    <body onload="init()">
      <script type="text/javascript">
        function init() 
            this.ws = new WebSocket("ws://localhost:1234");
            console.log("opening");

            // on close, display message and try to reopen
            this.ws.onclose = function (evt) 
                console.log("closed");
            
        
      </script>
    </body>
</html>

连接到不存在的 websocket 端点。我希望这基本上会立即出错,但在 Firefox 中,打印“打开”和打印“关闭”之间的时间超过一分钟:

这是预期行为,还是可以将其配置为更快地超时?在 Chrome 中,连接错误立即出现:

【问题讨论】:

我使用的是 Firefox 71.0(64 位),它会立即写入错误/关闭连接(在 Chrome 中的行为相同)。在 Macbook Pro Catalina 10.15.2 上运行它 有趣,我是 Linux Mint 上的 Firefox 71(64 位)。对我来说,它一直需要超过 60 秒。 标记注释:这是 superbad JS。您正在编写现代 HTML 和 JS:不要在 HTML 元素上使用 any on...=。 (1) 不要使用type="text/javascript" for script tags: you're using HTML5: script` 默认是Javascript。 (2) 使你的 JS 成为一个实际的文件,以便 (3) 你可以使用&lt;script src="..." defer&gt;&lt;/script&gt;。这将与其他所有内容并行加载源代码,但仅在整个文档被解析后运行它。然后将 &lt;script&gt; 放在 head 元素中。既然我们有了asyncdefer,就不要再把JS 放在你的身体里了。另外:&lt;meta charset="utf-8"&gt;。再次:HTML5 @Mike'Pomax'Kamermans 感谢您提供宝贵的信息,但 (1) 这对这里有什么帮助? (2) 很确定 OP 只是提供了该演示/示例作为用于测试的“最低分母”类型的代码...... @gct 哪个桌面用于 Linux Mint?我可以快速启动虚拟机进行测试.. 【参考方案1】:

找到了。这是符合 RFC 6455 的 intentional 行为。根据 this 补丁,它使用最多 60 秒的指数退避。不幸的是,我认为这意味着自动重新连接到 Firefox 中的 websocket 端点被破坏了。

【讨论】:

以上是关于Firefox 在连接错误时不会立即关闭 WebSocket?的主要内容,如果未能解决你的问题,请参考以下文章

客户端立即连接和断开连接没有错误消息?

单击Firefox中的选择会立即导致选项下拉菜单关闭

Websocket 握手仅在 IE 10 中立即关闭

Firefox 4 中的 JQuery 未定义和 $ 未定义错误 [关闭]

Jetty 9.2.x Websocket Server连接在使用Firefox而不是Chrome时连接后自动关闭

浏览器上的 GCDAsyncSocket 立即连接和断开连接,并出现“远程对等方关闭套接字”错误