Socket.io“连接”事件在每个客户端心跳上触发?

时间:2012-06-20 23:00:15

标签: node.js socket.io

我有一个基本的Socket.io服务器设置如下:

var server = express.createServer().listen(port);
    this.io = socketIO.listen(server);

this.io.sockets.on('connection', function(socket){
        initSocket(socket);
    });

我也将socket.io配置为使用XHR轮询,如下所示:

io.set("transports", ["xhr-polling"]);
io.set("close timeout", 3);
io.set("heartbeat interval", 2); 

问题是每次客户端发送心跳(每2秒)时,就会触发“连接”事件。是否有一个我可以使用的不同事件,每次插座最初连接时会触发一次?

我会使用“授权”事件,但只传递握手对象而不是实际套接字。

2 个答案:

答案 0 :(得分:3)

发现问题。我将xhr“轮询持续时间”设置为heroku建议的10s,如下所示:

io.set("polling duration", 10);

这意味着客户端每10秒才会发出一个新的xhr请求(一旦上一个请求返回)。与此同时,我将“关闭超时”设置为3秒:

io.set("close timeout", 3);

这意味着如果服务器在上次请求后的3秒内没有收到来自客户端的消息,则会关闭连接,因此会触发连续的“断开/连接”事件。

解决方案是将关闭超时设置为高于轮询持续时间。似乎“心跳间隔”与xhr连接无关。

答案 1 :(得分:1)

您是否为closetimeout和心跳间隔设置的值太低。这些的默认值是60秒和25秒。典型的网络延迟大约为5秒。因此,使用您设置的值,客户端不会在指定的时间内响应,因此关闭连接。当客户端再次连接时,将触发连接事件。