我有移动客户端连接到node.js服务器,通过xhr-polling运行socket.io。我有两种类型的客户:
输入A
当网络问题导致连接中断时(或者说网络问题) 客户端崩溃)默认心跳超时太长
B型
当这个客户端的连接中断时,我需要给它更多 恢复的时间 - 客户恢复比重要更重要 服务器中断连接/会话
所以我的问题是如何配置(如果可能的话)来自实际客户端的心跳超时?
答案 0 :(得分:52)
据我所知,这里有两个值很重要:服务器每隔heartbeat interval
秒向客户端发送一次心跳;客户端直接响应,如果没有响应,服务器决定客户端已经死亡。自上次心跳(显然应高于heartbeat timeout
)以来,客户端等待服务器的心跳持续heartbeat interval
秒。如果它在heartbeat timeout
秒内没有从服务器收到消息,则表示服务器已经死机(并将根据您设置的其他选项开始断开连接/重新连接。
默认值为heartbeat interval = 25s
和heartbeat 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黑客你应该能够实现它,但你可能会破坏其他东西......
答案 1 :(得分:22)
在socket.io 1.x中,API已经改变,但概念保持不变。
而不是heartbeatInterval和heartbeatTimeout,属性是pingInterval和pingTimeout。例如,
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。
答案 2 :(得分:12)
要完成Claude的回答,您可以使用以下代码
在服务器控制杆上设置这些值io.set('heartbeat interval', 5);
io.set('heartbeat timeout', 11);
然后你可以创建2个node.js服务器,每个类型的客户端(A和B)一个,有2个所需的选项集(心跳超时和间隔)。