【问题标题】: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
如果有更多信息,那么您可以尝试向我们提供可能有助于缩小问题范围的信息。