Socket.IO Connected User Count

node.jsWebsocketsocket.io

node.js Problem Overview


I finally got Socket.IO to work properly, but I have encountered a strange problem.

I am not sure if this is the best way, but I am using:

io.sockets.clients().length

This returns the number of clients connected to my server. The problem is after a few connects and disconnects of users, the number starts to stay higher than it should be.

For instance, if I connect and ask my friends to, the number goes up which is correct. But when we start to disconnect and reconnect the number does not decrease.

I am running the Node.js and Socket.IO server on a VMware Ubuntu server.

Why is this or is there a better method for finding out how many people are connected to the server?

node.js Solutions


Solution 1 - node.js

Just in case someone gets to this page while using socket.io version 1.0

You can get the connected clients count from

socketIO.engine.clientsCount

Need an answer and the above did not work for new version of socket.io

Solution 2 - node.js

There is a github issue for this. The problem is that whenever someone disconnects socket.io doesn't delete ( splice ) from the array, but simply sets the value to "null", so in fact you have a lot of null values in your array, which make your clients().length bigger than the connections you have in reality.

You have to manage a different way for counting your clients, e.g. something like

socket.on('connect', function() { connectCounter++; });
socket.on('disconnect', function() { connectCounter--; });

It's a mind buzz, why the people behind socket.io have left the things like that, but it is better explain in the github issue, which I posted as a link!

Solution 3 - node.js

I have found the way to figure it out in version 1.3.7. There are three methods as follows:

  1. io.engine.clientsCount
  2. io.sockets.sockets.length
  3. Object.keys(io.sockets.connected).length

Hope these can help someone with the same issue.:)

Solution 4 - node.js

with socket.io 2.2.0 it's easier :

io.on('connection', function (socket) {
 	console.log( socket.client.conn.server.clientsCount + " users connected" );
});

cheers

Solution 5 - node.js

Tested using Socket.IO v2.3.0 using namespace, I found 4 locations having the clientCounts property (it's probably the same Server object each time):

const socketio = require('socket.io');
const io = socketio(http_server);

const io_namespace = io.of('/foobar');

io_namespace.on('connection', function(socket)
{
	console.log(socket.conn.server.clientsCount);
	console.log(socket.server.engine.clientsCount);
	console.log(io.engine.clientsCount);
	console.log(io_namespace.server.engine.clientsCount);
});

Solution 6 - node.js

Why use an (implicit global) variable when you could always filter the array, that is returned by calling the clients() method.

io.sockets.clients().filter(c => !!c).length;

EDIT use shorter syntax

Solution 7 - node.js

Connected Users count in number with socket.io version - 1.3.7

const io = require("socket.io");

io.on('connection', (socket) => {
    console.log(io.sockets.server.httpServer._connections);  //output in number
    // or
    console.log(io.sockets.server.engine.clientsCount);  //output in number
});

Solution 8 - node.js

I am currently using Socket.io v1.3.6 and have found that this works. It gives an accurate number when users connect and when they disconnect:

io.sockets.sockets.length

Like so:

var io = require('socket.io').listen(server);
io.on('connection', function(socket) {
  console.log(io.sockets.sockets.length);
  socket.on('disconnect', function() {
    console.log(io.sockets.sockets.length);
  });
});

Solution 9 - node.js

After spending quite some time reading Stack Overflow posts and looking at io.sockets.sockets many times, I found that to get the number of sockets that are connected, you need to do:

// io is the 'require'd socket.io module

io.on("connection",function(socket){
	console.log("The number of connected sockets: "+socket.adapter.sids.size);
});

I've tested this very simple solution on [email protected].

Solution 10 - node.js

I'm using socket.io 0.9.10 and the following code to determine the number of sockets:

var socketIO =  require('socket.io').listen( .....
var numberOfSockets = Object.keys(socketIO.connected).length;

Not sure how accurate this number reacts to the various edge-cases, but 'til now it seems accurate: every browser connecting increases the number, every browser closed decreases it.

Solution 11 - node.js

Also take a look into:

io.sockets.manager.connected

It's a clean list of key value pairs (socket id and connection state?)

Solution 12 - node.js

I don't see any mention of multi core apps so I'm just gonna add that since I am using multiple cores ( clusters ) I wasn't able to get the right number of sockets consistently on the client side, so I ended up saving them to my mongo instance and it is quite consistent and accurate. With this approach I can view my socket connections in style via the browser :).

Mongoose schema :

var socketSchema = mongoose.Schema({
		socket : Number
});

Usage:

//reset to 0 when the app starts ( just in case )
SocketModel.find({ "socket" : 1 } , function(err, deadSockets ) {
	if (err){
		console.log( err );
	}
	else{
		for( var i = 0 ; i < deadSockets.length ; i++ ){
			deadSockets[i].remove();				
		}
	}
});

io.on('connection', function( socket ) {
	//I found I needed to make sure I had a socket object to get proper counts consistantly
	if( socket ){
		var socketEntry = new SocketModel({ "socket" : 1 });
		socketEntry.save( function(err ){
			if (err){
				console.log( err );
			}
			else{
		
			}
		});
	}
	//On Disconnect
	socket.on('disconnect', function() {
		SocketModel.findOne({ "socket" : 1} , function(err, deadSocket ) {
			if (err){
				console.log( err );
			}
			else{
				deadSocket.remove();
			}
		});	
	});
});

How many do I have ?

SocketModel.count({ "socket" : 1 } , function(err, count ) {
	if (err){
        console.log(err);
    }
	else{
		var term = "sockets";
		if( count == 1 ) term = "socket";
		console.log("Current Load: " , count , term );
	}
});	

NOTE I don't like using empty query objects ( {} ) so I just used { "socket" : 1 } as a dummy instead

Solution 13 - node.js

I am currently using socket v1.4.29 with typeScript, you can find the number of clients connected by using this

 io.sockets.on('connection', function(socket) {
 var clients = socket.client.conn.emit.length;
 console.log("clients: " + clients);
 });

Solution 14 - node.js

To return the total number of connected clients

console.log(io.engine.clientsCount)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionimperium2335View Question on Stackoverflow
Solution 1 - node.jsAhmadView Answer on Stackoverflow
Solution 2 - node.jsdrinchevView Answer on Stackoverflow
Solution 3 - node.jsLordranView Answer on Stackoverflow
Solution 4 - node.jsrafa226View Answer on Stackoverflow
Solution 5 - node.jsTristan CHARBONNIERView Answer on Stackoverflow
Solution 6 - node.jsline-oView Answer on Stackoverflow
Solution 7 - node.jsPavani dasariView Answer on Stackoverflow
Solution 8 - node.jsdevtancView Answer on Stackoverflow
Solution 9 - node.jsLakshya RajView Answer on Stackoverflow
Solution 10 - node.jsdknausView Answer on Stackoverflow
Solution 11 - node.jsGilbert FlaminoView Answer on Stackoverflow
Solution 12 - node.jsSquivoView Answer on Stackoverflow
Solution 13 - node.jsparinitaView Answer on Stackoverflow
Solution 14 - node.jsAbílio Soares CoelhoView Answer on Stackoverflow