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

Mar*_*tin 23 client node.js socket.io

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

  • A型

    当由于网络问题(或客户端崩溃)导致连接中断时,默认心跳超时太长

  • B型

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

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

Cla*_*ude 55

据我所知,这里有两个值很重要:服务器每秒都会向客户端发送心跳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
Run Code Online (Sandbox Code Playgroud)

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

我敢肯定,对于一些socket.io黑客你应该能够实现它,但你可能会在这个过程中打破其他东西......

  • 请看http://stackoverflow.com/a/31146441/671457 @ Joseph238的答案,如果你像我一样来自未来. (3认同)

Jos*_*238 22

在socket.io 1.x中,API已经改变,但概念保持不变.

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

var server = app.listen(80);
io = socketio(server,{'pingInterval': 45000});
Run Code Online (Sandbox Code Playgroud)

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


rad*_*122 11

要完成Claude的答案,您可以使用以下代码在服务器控制杆上设置这些值

io.set('heartbeat interval', 5);
io.set('heartbeat timeout', 11);
Run Code Online (Sandbox Code Playgroud)

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