【发布时间】:2017-06-23 06:58:15
【问题描述】:
我正在使用 Socket.io 创建与 Node.js 的 WebSocket 连接。在某些时候,我有一个长时间运行的函数会阻塞主线程,发生这种情况后,传输(在本例中为 websockets)似乎被 Google Chrome 本身关闭。
后端根本没有断开连接消息,close 事件中的消息只是transport close。
有人知道这是如何/为什么会发生的吗?我玩过 Socket.io 的超时(pingTimeout 和 pingInterval),但这似乎对我的情况没有任何影响。
编辑:好的,我尝试更改服务器和客户端上的pingTimeout 和pingInterval,但无济于事..
这是我使用的代码:
客户:
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