Websocket 无故断开并出现 1006 错误

Posted

技术标签:

【中文标题】Websocket 无故断开并出现 1006 错误【英文标题】:Websocket disconnects with 1006 error, without a reason 【发布时间】:2019-02-27 16:01:11 【问题描述】:

我正在记录我的网页游戏中的断开连接。似乎 75% 的会话与代码 1001(正常)断开连接,而 25% 的会话与代码 1006(错误)断开连接。 https://www.rfc-editor.org/rfc/rfc6455

有时我看到这个文本的错误原因:

CloudFlare WebSocket 代理重启

但是 1006 次断开连接中的大多数根本没有给出任何理由。玩家完全没有理由断开连接。这通常发生在玩家积极玩游戏时的 5-30 分钟。

我的设置有这些:

Node.js Express.js Cloudflare 数字海洋 码头工人 https://github.com/websockets/ws SSL nginx 超时 = 3600 秒 Ping/Pong isAlive = 30s

我的问题是:

    如何更好地调试此问题? 哪些常见情况可能导致此问题?

【问题讨论】:

1006 表示连接以非正常方式关闭。当浏览器(标签?)被简单地杀死(愤怒退出?:D)时,就会发生这种情况。我不确定浏览器是否有义务在关闭时发送关闭帧(我认为不是)。即使是这样,我也很确定并非所有人都这样做。另一种情况是连接因任何原因而中断。例如,当移动设备超出网络范围时。是的,对于手机来说,这肯定会更频繁地发生。无论如何,我没有理由特别对待 1006。 这种情况发生在不应该发生的时候,比如当玩家有稳定的网络连接、没有关闭标签、正在玩、正在获胜时。 (这是一款浏览器 PC 游戏)25% 的连接会像这样消失,这听起来太多了,肯定是某个地方存在错误,我不知道下一步该尝试什么 你怎么知道用户没有关闭标签页?此外,连接上的流量有多大?是否有可能是某个代理服务器超时? 1.当我在测试时尝试关闭选项卡时,收到错误代码 1001。 2. 玩家偶尔会向我发送他们的屏幕截图和 javascript 控制台。 您确定没有任何中间服务器在 30 秒 ping 之前终止连接吗?如果是这样,那么这可能是 ISP/防火墙问题。 【参考方案1】:

此特定错误的原因是 Cloudflare 更新了其 SSL、防火墙、Nginx、物理服务器的软件或配置。

他们系统中几乎所有正在更新的堆栈都会踢出您的 websocket。您有 2 个解决方案:

    Websockets 不使用 Cloudflare 具有自动重新连接逻辑

【讨论】:

以上是关于Websocket 无故断开并出现 1006 错误的主要内容,如果未能解决你的问题,请参考以下文章

Node.js "ws" websocket 服务器在约 30 秒后随机断开客户端,错误 1006

请教html5的websocket无缘无故客户端主动断开原因

Nginx websocket proxy断连问题

WebSocket 在 Internet Explorer 下关闭 - 错误代码 1006

当我在 Open*** 后面时,浏览器在建立 WebSocket 连接一秒后关闭并显示错误 1006

WebSocket 连接已关闭:代码 = 1006