在 socket.io 中控制来自客户端的心跳超时

Posted

技术标签:

【中文标题】在 socket.io 中控制来自客户端的心跳超时【英文标题】:Controlling the heartbeat timeout from the client in socket.io 【发布时间】:2012-09-30 16:21:26 【问题描述】:

我有移动客户端连接到 node.js 服务器,通过 xhr-polling 运行 socket.io。我有两种类型的客户:

A型

当连接由于网络问题(或 客户端崩溃)默认心跳超时时间过长

B型

当这个客户端的连接中断时,我需要给它更多 恢复的时间——客户恢复比恢复更重要 服务器断开连接/会话

所以我的问题是如何配置(如果可能的话)来自实际客户端的心跳超时?

【问题讨论】:

不确定心跳超时,但如果您使用的是 socket.io-client,有一些有用的选项可能会对您有所帮助,例如 connect timeout reconnection delay max reconnection attempts 【参考方案1】:

据我所知,这里有两个重要的值:服务器每heartbeat interval 秒向客户端发送一次心跳;客户端直接响应,如果没有响应,则服务器判定客户端死亡。自上次心跳后,客户端等待来自服务器的心跳heartbeat timeout 秒(显然应该高于heartbeat interval)。如果它在heartbeat timeout 秒内没有收到来自服务器的消息,则假定服务器已死(并将根据您设置的其他选项开始断开/重新连接。

默认值为heartbeat interval = 25sheartbeat timeout = 60s。这两项都在服务器上设置,heartbeat timeout 在连接时发送到客户端。

为单个客户端更改heartbeat timeout 很容易:

var socket = io.connect(url);
socket.heartbeatTimeout = 20000; // reconnect if not received heartbeat for 20 seconds

但是在服务器上,heartbeat interval 值似乎是共享对象的一部分(管理器,这是您从 var io = require("socket.io").listen(server) 调用返回的),这意味着它不能轻易更改为单独的套接字。

我确信通过一些 socket.io 黑客攻击你应该能够实现它,但你可能会在这个过程中破坏其他东西......

【讨论】:

如果你像我一样来自未来,那就看看***.com/a/31146441/671457@Joseph238 的回答吧。【参考方案2】:

在 socket.io 1.x 中,API 发生了变化,但概念保持不变。

属性是 pingInterval 和 pingTimeout,而不是 heartbeatInterval 和 heartbeatTimeout。例如,

var server = app.listen(80);
io = socketio(server,'pingInterval': 45000);

请参阅http://socket.io/docs/server-api/#server(opts:object) 上的文档,它将引导您到https://github.com/Automattic/engine.io#methods-1。

【讨论】:

【参考方案3】:

要完成 Claude 的回答,您可以使用以下代码在服务器端设置这些值

io.set('heartbeat interval', 5);
io.set('heartbeat timeout', 11);

然后您可以创建 2 个 node.js 服务器,一个用于每种类型的客户端(A 和 B),具有 2 个所需的选项集(心跳超时和间隔)。

【讨论】:

可以在某处的任何文档中找到它吗? 不幸的是,我在任何文档中都没有找到这个,无论如何它都很短。但在实践中,我注意到使用上面的代码,值实际上发生了变化。 这个答案对socket.io 0.9.*有效。 socket.io/lib/master.js 中的文档。

以上是关于在 socket.io 中控制来自客户端的心跳超时的主要内容,如果未能解决你的问题,请参考以下文章

在 socket.io 上设置高关闭超时是不是安全?

非活动客户端连接的socket.io服务器端超时?

如何从客户端断开和重新连接 socket.io?

如何在客户端中获取 socket.io 客户端的会话 ID

来自互联网的本地 Socket.io 连接

socket.io 在空闲时断开客户端的连接