Socket.io “connection” event fired on every client

2019-02-15 14:18发布

I have a basic Socket.io server setup like this:

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

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

I also have socket.io configured to use XHR polling like so:

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

The issue is every time the client sends a heartbeat (every 2 sec), the 'connection' event is being fired. Is there a different event I can use that will fire once each time a socket initially connects?

I would use the "authorization" event, but that only passes in a handshake object not the actual socket.

2条回答
何必那么认真
2楼-- · 2019-02-15 14:27

Are you setting too low a value for closetimeout and heartbeat interval. The default values for these are 60 sec and 25 sec. Typical network lag is of the order of 5 sec. So with the values that you have set, the client does not respond in the time specified, so the connection is closed. When the client connects again, the connection event is fired.

查看更多
闹够了就滚
3楼-- · 2019-02-15 14:33

Found the problem. I had my xhr "polling duration" set to heroku's suggested 10s like so:

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

Which means that the client only makes a new xhr request every 10 seconds (as soon as the previous request returns). At the same time I had the "close timeout" set to 3 seconds:

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

Which means if the server does not hear from the client within 3 seconds since its last request it closes the connection, hence the continuous 'disconnect/connection' events being fired.

The solution was to set the close timeout higher than the polling duration. It would seem that the "heartbeat interval" is not relevant for xhr connections.

查看更多
登录 后发表回答