io.on('connection',...) vs io.sockets.on('connection',...)

Srinath picture Srinath · Jun 17, 2014 · Viewed 20.2k times · Source

I am using socket.io and the Mean stack for a web app. I started the server for socket on 3006 port..

var http = require('http').createServer(app);
http.listen(3006);
var io = require('socket.io').listen(http);

Both of these seem to work on connection.

io.on('connection', function (socket) {
    console.log('Socket succesfully connected with id: '+socket.id);
});

and...

io.sockets.on('connection', function (socket) {
   console.log('Socket succesfully connected with id: '+socket.id);
});

What is the difference between io.on and io.sockets.on and which one should I use on first time connection..?

Though socket.on npm page uses io.on why is it working for io.sockets.on

Answer

AJO_ picture AJO_ · Jun 17, 2014

The default namespace that Socket.IO clients connect to by default is: /. It is identified by io.sockets or simply io (docs).

This example copied from the documentation:

// the following two will emit to all the sockets connected to `/`

io.sockets.emit('hi', 'everyone');

io.emit('hi', 'everyone');           // short form

I assume it is the same for 'on', as it is for 'emit': using 'io.sockets' is equivalent to using 'io' only, it's just a shorter form.

To “namespace” your sockets, means assigning different endpoints or paths (which can be useful).

From an answer to this SO question:

"Socket.io does all the work for you as if it is two separate instances, but still limits the information to one connection, which is pretty smart."