node.js - Socket.IO - how do I get a list of connected sockets/clients?

ID : 20346

viewed : 21

Tags : node.jssocket.ionode.js

Top 5 Answer for node.js - Socket.IO - how do I get a list of connected sockets/clients?

vote vote

98

In Socket.IO 0.7 you have a clients method on the namespaces, this returns a array of all connected sockets.

API for no namespace:

var clients = io.sockets.clients(); var clients = io.sockets.clients('room'); // all users from room `room` 

For a namespace

var clients = io.of('/chat').clients(); var clients = io.of('/chat').clients('room'); // all users from room `room` 

Hopes this helps someone in the future

NOTE: This Solution ONLY works with version prior to 1.0


UPDATED 2020 Mar 06

From 1.x and above, please refer to this link: getting how many people are in a chat room in socket.io

vote vote

82

Socket.io 1.4

Object.keys(io.sockets.sockets); gives you all the connected sockets.

Socket.io 1.0 As of socket.io 1.0, the actual accepted answer isn't valid anymore. So I made a small function that I use as a temporary fix :

function findClientsSocket(roomId, namespace) {     var res = []     // the default namespace is "/"     , ns = io.of(namespace ||"/");      if (ns) {         for (var id in ns.connected) {             if(roomId) {                 var index = ns.connected[id].rooms.indexOf(roomId);                 if(index !== -1) {                     res.push(ns.connected[id]);                 }             } else {                 res.push(ns.connected[id]);             }         }     }     return res; } 

Api for No namespace becomes

// var clients = io.sockets.clients(); // becomes :  var clients = findClientsSocket();  // var clients = io.sockets.clients('room'); // all users from room `room` // becomes var clients = findClientsSocket('room'); 

Api for a namespace becomes :

// var clients = io.of('/chat').clients(); // becomes var clients = findClientsSocket(null, '/chat');  // var clients = io.of('/chat').clients('room'); // all users from room `room` // becomes var clients = findClientsSocket('room', '/chat'); 

Also see this related question, in which I give a function that returns the sockets for a given room.

function findClientsSocketByRoomId(roomId) { var res = [] , room = io.sockets.adapter.rooms[roomId]; if (room) {     for (var id in room) {     res.push(io.sockets.adapter.nsp.connected[id]);     } } return res; } 

Socket.io 0.7

API for no namespace:

var clients = io.sockets.clients(); var clients = io.sockets.clients('room'); // all users from room `room` 

For a namespace

var clients = io.of('/chat').clients(); var clients = io.of('/chat').clients('room'); // all users from room `room` 

Note: Since it seems the socket.io API is prone to breaking, and some solution rely on implementation details, it could be a matter of tracking the clients yourself:

var clients = [];  io.sockets.on('connect', function(client) {     clients.push(client);       client.on('disconnect', function() {         clients.splice(clients.indexOf(client), 1);     }); }); 
vote vote

72

After socket.io 1.0 we cannot use

io.sockets.clients();  or io.sockets.clients('room');  

anymore. Instead you can use the following

var clients_in_the_room = io.sockets.adapter.rooms[roomId];  for (var clientId in clients_in_the_room ) {   console.log('client: %s', clientId); //Seeing is believing    var client_socket = io.sockets.connected[clientId];//Do whatever you want with this } 
vote vote

69

Using Socket.IO 1.x:

Get array of the connected clients:

io.engine === io.eio // => true Object.keys(io.engine.clients) // => [ 'US8AxrUrrDF_G7ZUAAAA', 'Ov2Ca24Olkhf2NHbAAAB' ] Object.keys(io.eio.clients)    // => [ 'US8AxrUrrDF_G7ZUAAAA', 'Ov2Ca24Olkhf2NHbAAAB' ] 

Get the number of connected clients:

io.engine.clientsCount // => 2 io.eio.clientsCount    // => 2 
vote vote

55

Very simple in socket.io 1.3:

io.sockets.sockets - is an array containing the connected socket objects. If you stored the username in each socket, you can do:

io.sockets.sockets.map(function(e) {     return e.username; }) 

Boom. You have the names of all connected users.

Top 3 video Explaining node.js - Socket.IO - how do I get a list of connected sockets/clients?

Related QUESTION?