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?
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!
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
J'ai trouvé le moyen de le comprendre, dans la version 1.3.7. Il y a trois méthodes comme suit:
io.engine.clientsCount
io.sockets.sockets.length
Object.keys(io.sockets.connected).length
J'espère que ceux - ci peuvent aider quelqu'un avec le même problème.:)
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;
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?)
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.
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);
});
});
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
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);
});
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
});