Socket.io Nombre D'Utilisateurs Connectés

J'ai finalement eu socket.io pour fonctionner correctement, mais j'ai rencontré un problème étrange.

Je ne suis pas sûr si c'est le meilleur moyen, mais j'utilise:

io.sockets.clients().length

Cela renvoie le nombre de clients connectés à mon serveur. Le problème est qu'après quelques connexions et déconnexions des utilisateurs, le nombre commence à rester plus élevé qu'il ne devrait l'être.

Par exemple, si je me connecte et demande à mes amis, le nombre augmente ce qui est correct. Mais quand nous commençons à déconnecter et reconnecter le nombre ne diminue pas.

Je cours le nœud.js et sockets.io serveur sur un serveur VMware ubuntu.

Est-ce que quelqu'un sait pourquoi c'est ou a une meilleure méthode pour savoir combien de personnes sont connectées au serveur?

31
demandé sur imperium2335 2012-04-23 10:13:19

10 réponses

Il y a un problème github pour cela. Le problème est que chaque fois que quelqu'un se déconnecte socket.io ne supprime pas (splice ) du tableau, mais définit simplement la valeur sur "null", donc en fait vous avez beaucoup de valeurs null dans votre tableau, ce qui rend vos clients ().longueur plus grande que les connexions que vous avez en réalité.

Vous devez gérer une manière différente de compter vos clients, par exemple quelque chose comme

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

C'est un buzz d'esprit, pourquoi les gens derrière socket.io sont partis les choses comme ça, mais il vaut mieux expliquer dans le problème github, que j'ai posté comme un lien!

36
répondu drinchev 2013-10-16 13:40:22

Juste au cas où quelqu'un arrive à cette page en utilisant socket.io version 1.0

Vous pouvez obtenir le nombre de clients connectés à partir de

socketIO.engine.clientsCount

Besoin d'une réponse et ce qui précède n'a pas fonctionné pour la nouvelle version de socket.io

51
répondu Ahmad 2014-12-10 18:57:27

J'ai trouvé le moyen de le comprendre, dans la version 1.3.7. Il y a trois méthodes comme suit:

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

J'espère que ceux - ci peuvent aider quelqu'un avec le même problème.:)

21
répondu Zhaoyang Xu 2015-10-18 21:01:02

Pourquoi utiliser une variable (globale implicite) quand vous pouvez toujours filtrer le tableau, qui est retourné en appelant la méthode clients ().

function filterNullValues (i) {
  return (i!=null);
}
io.sockets.clients().filter(filterNullValues).length;
4
répondu line-o 2013-09-17 22:21:34

Jetez également un oeil dans:

io.sockets.manager.connected

C'est une liste propre de paires de valeurs clés (id de socket et état de connexion?)

3
répondu Gilbert Flamino 2012-09-28 23:21:15

J'utilise socket.io 0.9.10 et le code suivant pour déterminer le nombre de sockets:

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

Je ne sais pas à quel point ce nombre réagit aux différents cas de bord, mais jusqu'à présent, il semble précis: chaque navigateur se connectant augmente le nombre, chaque navigateur fermé le diminue.

3
répondu dknaus 2013-04-28 08:50:24

J'utilise actuellement Socket.io v1. 3. 6 et ont constaté que cela fonctionne. Il donne un nombre précis lorsque les utilisateurs se connectent et quand ils se déconnectent:

io.sockets.sockets.length

Comme ça:

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);
  });
});
3
répondu devtanc 2015-08-07 03:28:09

Je ne vois aucune mention des applications multi-cœurs, donc je vais juste ajouter que puisque j'utilise plusieurs cœurs (clusters), Je n'ai pas pu obtenir le bon nombre de sockets systématiquement du côté client, donc j'ai fini par les enregistrer dans mon instance mongo et c'est assez cohérent et précis. Avec cette approche, je peux voir mes connexions de socket dans le style via le navigateur :).

Schéma Mangouste:

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

Utilisation:

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

J'en ai combien ?

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

REMARQUE* JE Je n'aime pas utiliser des objets de requête vides ({}) donc j'ai juste utilisé { "socket": 1 } comme un mannequin à la place

0
répondu Squivo 2015-09-30 22:13:47

J'utilise actuellement socket v1.4. 29 avec typeScript, vous pouvez trouver le nombre de clients connectés en utilisant ceci

 io.sockets.on('connection', function(socket) {
 var clients = socket.client.conn.emit.length;
 console.log("clients: " + clients);
 });
0
répondu parinita 2018-03-30 06:18:43

Les utilisateurs connectés comptent en nombre avec socket.io version-1.3.7

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
});
0
répondu Pavani dasari 2018-08-28 06:33:44