web-dev-qa-db-fra.com

Nombre d'utilisateurs connectés Socket.io

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

Je ne suis pas sûr que ce soit la meilleure façon, 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 d'utilisateurs, le nombre commence à rester plus élevé qu'il ne devrait être.

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

J'exécute les serveurs node.js et sockets.io 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?

37
imperium2335

Il y a un problème de github pour cela. Le problème est que chaque fois que quelqu'un déconnecte socket.io ne supprime pas (épissure) du tableau, mais définit simplement la valeur à "null". ). 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 personnes derrière socket.io ont laissé des choses comme ça, mais il vaut mieux expliquer dans le numéro de github, que j’ai posté comme un lien!

39
drinchev

Juste au cas où quelqu'un arriverait à 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

56
Ahmad

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

function filterNullValues (i) {
  return (i!=null);
}
io.sockets.clients().filter(filterNullValues).length;
5
line-o

J'utilise actuellement Socket.io v1.3.6 et j'ai constaté que cela fonctionne. Il donne un nombre précis lorsque les utilisateurs se connectent et se déconnectent:

io.sockets.sockets.length

Ainsi:

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

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;

Vous ne savez pas exactement à quel point ce nombre réagit aux différents cas Edge, mais jusqu'à présent, il semble précis: chaque navigateur connecté augmente le nombre, chaque navigateur fermé le diminue.

3
dknaus

Jetez également un coup d'œil sur:

io.sockets.manager.connected

C'est une liste épurée de paires clé-valeur (ID de socket et état de connexion?)

3
Gilbert Flamino

Je ne vois aucune mention des applications multicœurs, je vais donc ajouter que, comme j'utilise plusieurs cœurs (clusters), je n'ai pas pu obtenir le nombre correct de sockets de manière cohérente du côté client, alors je me suis retrouvé les sauver dans mon exemple mongo et il est assez cohérent et précis. Avec cette approche, je peux visualiser mes connexions de socket avec style via le navigateur :). 

Schéma Mongoose: 

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

Combien en ai-je? 

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 * Je n'aime pas utiliser des objets de requête vides ({}), alors je viens d'utiliser {"socket": 1} à la place.

1
Squivo

J'utilise actuellement socket v1.4.29 avec TypeScript, vous pouvez trouver le nombre de clients connectés en utilisant cette 

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

Les utilisateurs connectés comptent en nombre avec la version socket.io - 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
Pavani dasari