Cerulean
Cerulean

Reputation: 6013

How many times can Socket.io 'connection' and 'disconnection' events be fired for single client?

EDIT: I see that I'm getting ping timeout and transport error reasons in my handler for disconnect on the server. This makes it difficult to maintain state in my server (I'm trying to keep track of which users are connected in a chat-like setup(. I was reading that it may be related to background tabs in Chrome (which I'm running). Does anyone have any experience with these 'spurious' disconnect events?

I'm new to Socket.io and am having some trouble understanding the connection and disconnection process.

As I understand it, the server receives the connection event once when a client connects, and one registers all the handlers for that client in the callback on on.('connection'). Is that true?

I want to maintain an of connected users, so I add a user to that array on the connection handler.

Should I then listen for the disconnect event to know when to remove a user from that array? Can I be guaranteed that that event will only be fired once?

It's a bit confusing, because on the client side, there is the connect event, which apparently can be fired multiple times -- the documentation says

// note: you should register event handlers outside of connect,
// so they are not registered again on reconnection

which is a different paradigm than on the server side, where all the handlers are registered inside the connection handler. But if the client-side connect event can fire on re-connection, what is the reconnect event for? (The docs says this event is "Fired upon a successful reconnection.")

In general I'm confused about the process of connection, disconnection and re-connection and how this relates to events, whether it happens "randomly" due to connection issues or only under the programmer's control, and how many times one should anticipate receiving each of these events -- once only for server, multiple times for client?

Thanks for any help!

Upvotes: 1

Views: 1311

Answers (1)

Nick Duncan
Nick Duncan

Reputation: 829

I'm new to Socket.io and am having some trouble understanding the connection and disconnection process.

Welcome to the wonderful world of Node.js + Socket.io It's super powerful!

As I understand it, the server receives the connection event once when a client connects, and one registers all the handlers for that client in the callback on on.('connection'). Is that true?

Correct. Take a look at this example of my code:

Server-side

var clients = []; /* stores all sockets on the fly */

io.on('connection', function (socket) {
  clients[socket.id] = socket; /* keeps an array of sockets currently connected */

  socket.on('disconnect', function (data) {
      console.log(socket.id + " disconnected");
      delete clients[socket.id];
  });

});

Client-side

socket = io.connect(YOUR_SOCKET_URI, { transports: ['websocket'] } );
socket_delegates();
socket_delegates = function() {
    // Socket events
    socket.on('connect', function(data) {
      /* handle on connect events */
    });
    socket.on('disconnect', function () {
      /* handle disconnect events - possibly reconnect? */
    });
    socket.on('reconnect', function () {
      /* handle reconnect events */
    });
    socket.on('reconnect_error', function () {
      /* handle reconnect error events - possible retry? */
    });
}

Should I then listen for the disconnect event to know when to remove a user from that array? Can I be guaranteed that that event will only be fired once?

Yes. You will see in the above server code that we listen for disconnect and then do what we need to.

Nothing should be random. You should have code in place to handle the connect, disconnect on the server side and code to handle the connect, disconnect and reconnect on the client side.

Upvotes: 1

Related Questions