【问题标题】:Socket.io "connection" event fired on every client heartbeat?每个客户端心跳都会触发 Socket.io“连接”事件?
【发布时间】:2012-06-23 04:05:02
【问题描述】:

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

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

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-10
        • 2020-09-25
        相关资源
        最近更新 更多