imperium2335
imperium2335

Reputation: 24112

Socket.IO Connected User Count

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?

Upvotes: 64

Views: 99780

Answers (14)

Lakshya Raj
Lakshya Raj

Reputation: 1775

After spending quite some time reading Stack Overflow posts and looking at socket objects 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].

Upvotes: 6

To return the total number of connected clients

console.log(io.engine.clientsCount)

Upvotes: 0

Pavani dasari
Pavani dasari

Reputation: 81

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
});

Upvotes: 8

line-o
line-o

Reputation: 1895

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

Upvotes: 8

Squivo
Squivo

Reputation: 927

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

Upvotes: 1

Tristan CHARBONNIER
Tristan CHARBONNIER

Reputation: 1231

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);
});

Upvotes: 11

rafa226
rafa226

Reputation: 546

with socket.io 2.2.0 it's easier :

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

cheers

Upvotes: 13

parinita
parinita

Reputation: 11

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);
 });

Upvotes: 1

Lordran
Lordran

Reputation: 683

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.:)

Upvotes: 38

devtanc
devtanc

Reputation: 136

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);
  });
});

Upvotes: 5

Ahmad
Ahmad

Reputation: 1931

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

Upvotes: 75

Ivan Drinchev
Ivan Drinchev

Reputation: 19581

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!

Upvotes: 58

dknaus
dknaus

Reputation: 1203

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.

Upvotes: 3

Gilbert Flamino
Gilbert Flamino

Reputation: 111

Also take a look into:

io.sockets.manager.connected

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

Upvotes: 3

Related Questions