【问题标题】:WebSocket seemingly closed by Google Chrome for no reasonWebSocket 似乎被 Google Chrome 无缘无故关闭了
【发布时间】:2017-06-23 06:58:15
【问题描述】:

我正在使用 Socket.io 创建与 Node.js 的 WebSocket 连接。在某些时候,我有一个长时间运行的函数会阻塞主线程,发生这种情况后,传输(在本例中为 websockets)似乎被 Google Chrome 本身关闭。

后端根本没有断开连接消息,close 事件中的消息只是transport close

有人知道这是如何/为什么会发生的吗?我玩过 Socket.io 的超时(pingTimeoutpingInterval),但这似乎对我的情况没有任何影响。

编辑:好的,我尝试更改服务器和客户端上的pingTimeoutpingInterval,但无济于事..

这是我使用的代码:

客户:

this._socket = io(location.href, {
    path: `${location.path}socket.io`,
    reconnection: false,
    pingTimeout: 120000,
    pingInterval: 60000
});

服务器:

const server = http.createServer();
const io = socketio(server, {
    pingTimeout: 120000,
    pingInterval: 60000
});

【问题讨论】:

  • 开始的地方是:“阻塞主线程的长时间运行函数”。不是一个好主意。如果这是 socket.io,那么可能是因为您不允许客户端处理 socket.io 用来查看套接字是否仍然存在的 ping/pong 消息。另外,请向我们展示您的特定代码以及您尝试使用超时的确切内容。 “玩弄超时”根本不会告诉我们您尝试了什么或设置了什么。有关代码的问题应包含您的实际代码!我们在理论或假设问题上做得很差,而在实际代码上做得很好。
  • Socket.io 的心跳(ping/pong)超时,默认为 60 秒。我知道长时间运行的功能不是一个好主意,但在解决这个问题之前,我需要确切知道导致断开连接的原因。谷歌浏览器是否有可能因为没有心跳超时而断开连接?在这里添加代码非常困难,因为它实际上只是:连接到服务器,阻塞主线程,断开连接。目前我使用这段代码来模拟一个阻塞函数:let a = 0; for (let i = 0; i < 10000000000; i++) { a += i; }
  • 当你说你“玩弄超时”时,我想看看你到底尝试了什么代码。有很多设置,文档不是很好。我想知道你实际尝试了什么。向我们展示代码。而且,您要处理多长时间运行的函数?告诉我们多少秒。而且,您是否也控制服务配置?您当前的问题中根本没有足够的信息让我们做任何事情,只能猜测,根据定义,我们猜测的问题不是非常完整的问题。
  • 我已经添加了您要求的超时属性,长时间运行功能的代码在我的评论中。这会阻塞 UI 线程大约 3-5 秒。我控制两个端点。
  • 我让你给我看你用来设置这些时间间隔的代码。我想先看看你是否做得对。

标签: javascript node.js sockets websocket socket.io


【解决方案1】:

根据this answer - Controlling the heartbeat from the client 中的描述,您需要关注两个问题:

1) 服务器向客户端发送心跳,然后等待一段时间的响应。如果未发回响应,则服务器假定套接字未正常工作并关闭它。

2) 客户端在一段时间内等待来自服务器的心跳,如果它确实收到了心跳,则认为套接字没有工作并关闭它并尝试重新连接。

因此,要延长套接字在没有活动的情况下可以持续的时间,您必须更改连接的客户端和服务器端的时间。仅在客户端上更改它不会阻止服务器关闭它未能获得对其心跳消息的响应的连接。更多关于如何更改这些心跳间隔和超时的讨论:Controlling the heartbeat timeout from the client in socket.io

阅读有关此主题时要非常小心,您所阅读的内容适用于 socket.io 1.x 而不是旧版本,因为 1.x 发生了很多变化。

【讨论】:

  • 我确实尝试单独在服务器上执行此操作。感谢您的意见,我会阅读您链接的帖子,看看它们是否对我有帮助。
  • @robin_f - 您需要在客户端和服务器上配置更长的超时时间。
  • 我试过了,它仍然以错误代码 1005 关闭,循环完成后没有消息。即使有很长的超时和间隔。我更新了原来的问题。
  • @Robin_f - 什么代码给你错误 1005 和什么循环?请显示这些代码。
  • 我很确定所有的代码都在那里.. 但由于不够清楚,有时间我会用一个例子做一个回购。
【解决方案2】:

我想我遇到了同样的问题: Way to prevent socket.io from disconnecting on the client side?

疯狂的是我将 pingTimout 设置为一个高得离谱的数字,所以肯定有其他东西正在关闭连接。但它似乎与被阻塞的主线程相关。

【讨论】:

    猜你喜欢
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    相关资源
    最近更新 更多