2

我有一个基本的 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 秒)时,都会触发“连接”事件。是否有一个不同的事件可以在每次套接字最初连接时触发一次?

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

4

2 回答 2

3

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

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

这意味着客户端仅每 10 秒发出一个新的 xhr 请求(只要前一个请求返回)。同时我将“关闭超时”设置为 3 秒:

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

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

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

于 2012-06-21T14:40:28.607 回答
1

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

于 2012-06-21T03:51:05.003 回答