26

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

  • A型

    当连接因网络问题(或客户端崩溃)而中断时,默认心跳超时时间过长

  • B型

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

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

4

3 回答 3

56

据我所知,这里有两个重要的值:服务器每秒向客户端发送一次心跳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 黑客攻击你应该能够实现它,但你可能会在这个过程中破坏其他东西......

于 2012-10-11T19:17:13.693 回答
25

在 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

于 2015-06-30T19:08:04.830 回答
11

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

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

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

于 2014-08-07T12:32:44.810 回答