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

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

  • A型

    当由于networking问题(或客户端崩溃)而导致连接中断时,默认的心跳超时时间过长

  • B型

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

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

据我所知,这里有两个重要的值:服务器每隔heartbeat interval发送一次心跳到客户端; 客户端直接响应,如果没有响应,服务器决定客户端已经死亡。 自上一次心跳(显然应该高于heartbeat interval )以来,客户端等待来自服务器的heartbeat timeout秒数。 如果在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值似乎是共享对象的一部分(pipe理器,这是你从你的var io = require("socket.io").listen(server)调用得到的),这意味着不能轻易改变个别sockets。

我敢肯定,有一些socket.io黑客应该能够实现,但是你可能会破坏其他的东西…

在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

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

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

然后您可以创build2个node.js服务器,每个客户端(A和B)都有一个服务器,有2个期望的选项(心跳超时和间隔)。