【问题标题】:WebSocket does not connect to a specific host until Chromium is restarted在 Chromium 重新启动之前,WebSocket 不会连接到特定主机
【发布时间】:2020-10-26 13:46:38
【问题描述】:

我们正在尝试调试 Chromium 的一个问题(发生在 Chrome、Edge、Brave 中),它有时会进入不向特定主机打开 WebSocket 的状态。

我们可以在控制台日志中看到它正在尝试打开套接字,但它从未打开连接。它失败并出现 1006 错误。在新选项卡和新窗口中也会发生同样的情况。重新启动浏览器或使用隐身标签后,该行为会消失。

服务器上没有 HTTP 升级请求,并且连接在 chrome 开发工具中也没有显示为 WebSocket。我们没有太多其他事情要做。关于我们可以尝试调试问题的任何建议?

【问题讨论】:

    标签: google-chrome browser websocket microsoft-edge chromium


    【解决方案1】:

    我们一直面临这个确切的问题,即 Websocket 的升级请求永远不会到达服务器,即使网络检查选项卡显示请求已被触发。在我们切换到 Chrome 之前,再多的刷新或新标签都没有帮助。该问题是间歇性的,已无法调试,但由于未连接的 websocket,我们的用户仍不断报告无限加载条。

    我使用chrome://net-exports 捕获网络日志并在net-export viewer 上查看它,我唯一一次可以捕获该问题的日志时,我注意到浏览器只尝试 IPv6 地址而不是 IPv4 地址。 (当我们的服务器甚至没有服务器时)

    让 Brave 或 Chromium 团队参与其中是否明智?有人找到过具体的重现步骤吗?

    【讨论】:

      【解决方案2】:

      我在 2020 年期间在 Brave(但不是在 Chrome)中观察到完全相同的症状(不确定错误代码)......这是一个持续存在的问题......但从那以后它几乎没有发生过2021 年 1 月...除了上周(2021 年 4 月)外,它再次发生(在 Brave 中)。

      有没有其他人不时注意到这个问题仍然存在?或者可能是一个新的错误,类似但更罕见......

      完全相同的行为,套接字不会重新连接,除非在隐身或浏览器重新启动后。

      【讨论】:

        【解决方案3】:

        我尝试使用 MS Edge (chromium) 版本 83.0.478.58 和 Google Chrome 版本 83.0.4103.116 测试 Web 套接字

        在我的测试中,两个 Chromium 浏览器都运行良好,没有 1006 错误。

        这里是测试代码:

         <!DOCTYPE html>
          <meta charset="utf-8" />
          <title>WebSocket Test</title>
          <script language="javascript" type="text/javascript">
        
          var wsUri = "wss://echo.websocket.org/";
          var output;
        
          function init()
          {
            output = document.getElementById("output");
            testWebSocket();
          }
        
          function testWebSocket()
          {
            websocket = new WebSocket(wsUri);
            websocket.onopen = function(evt) { onOpen(evt) };
            websocket.onclose = function(evt) { onClose(evt) };
            websocket.onmessage = function(evt) { onMessage(evt) };
            websocket.onerror = function(evt) { onError(evt) };
          }
        
          function onOpen(evt)
          {
            writeToScreen("CONNECTED");
            doSend("WebSocket rocks");
          }
        
          function onClose(evt)
          {
            writeToScreen("DISCONNECTED");
          }
        
          function onMessage(evt)
          {
            writeToScreen('<span style="color: blue;">RESPONSE: ' + evt.data+'</span>');
            websocket.close();
          }
        
          function onError(evt)
          {
            writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data);
          }
        
          function doSend(message)
          {
            writeToScreen("SENT: " + message);
            websocket.send(message);
          }
        
          function writeToScreen(message)
          {
            var pre = document.createElement("p");
            pre.style.wordWrap = "break-word";
            pre.innerHTML = message;
            output.appendChild(pre);
          }
        
          window.addEventListener("load", init, false);
        
          </script>
        <body>
          <h2>WebSocket Test</h2>
        
          <div id="output"></div>
        </body>
        </html>

        参考:

        Web socket echo test

        尝试检查浏览器的安全设置,并确认您正在尝试使用安全连接进行连接。

        我发现 1006 是一个特殊代码,表示连接被浏览器实现异常(本地)关闭。

        我建议您可以查看 WebSocket.onerror(evt) 以获取有关错误的更多详细信息。

        有用的线程链接:

        getting the reason why WebSockets closed with close code 1006

        如果有更多信息,那么您可以尝试向我们提供可能有助于缩小问题范围的信息。

        【讨论】:

          猜你喜欢
          • 2016-05-04
          • 2012-07-17
          • 1970-01-01
          • 2012-08-02
          • 1970-01-01
          • 1970-01-01
          • 2020-07-12
          • 2013-11-10
          • 1970-01-01
          相关资源
          最近更新 更多