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 元素上使用 anyon...=
。 (1) 不要使用type="text/javascript" for script tags: you're using HTML5:
script` 默认是Javascript。 (2) 使你的 JS 成为一个实际的文件,以便 (3) 你可以使用<script src="..." defer></script>
。这将与其他所有内容并行加载源代码,但仅在整个文档被解析后运行它。然后将 <script>
放在 head 元素中。既然我们有了async
和defer
,就不要再把JS 放在你的身体里了。另外:<meta charset="utf-8">
。再次:HTML5
@Mike'Pomax'Kamermans 感谢您提供宝贵的信息,但 (1) 这对这里有什么帮助? (2) 很确定 OP 只是提供了该演示/示例作为用于测试的“最低分母”类型的代码......
@gct 哪个桌面用于 Linux Mint?我可以快速启动虚拟机进行测试..
【参考方案1】:
找到了。这是符合 RFC 6455 的 intentional 行为。根据 this 补丁,它使用最多 60 秒的指数退避。不幸的是,我认为这意味着自动重新连接到 Firefox 中的 websocket 端点被破坏了。
【讨论】:
以上是关于Firefox 在连接错误时不会立即关闭 WebSocket?的主要内容,如果未能解决你的问题,请参考以下文章
Firefox 4 中的 JQuery 未定义和 $ 未定义错误 [关闭]