在 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 = 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 黑客攻击你应该能够实现它,但你可能会在这个过程中破坏其他东西......
【讨论】:
如果你像我一样来自未来,那就看看***.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 中控制来自客户端的心跳超时的主要内容,如果未能解决你的问题,请参考以下文章