wake-up-neo.net

Socket.io Connected User Count

Endlich habe ich socket.io dazu gebracht, richtig zu arbeiten, aber ich habe ein seltsames Problem festgestellt.

Ich bin nicht sicher, ob dies der beste Weg ist, aber ich verwende:

io.sockets.clients().length

Dies gibt die Anzahl der mit meinem Server verbundenen Clients zurück. Das Problem besteht darin, dass nach ein paar Verbindungen und Verbindungsabbrüchen der Benutzer die Nummer höher bleibt, als sie sein sollte.

Wenn ich zum Beispiel eine Verbindung herstellen und meine Freunde darum bitten werde, steigt die Nummer, die korrekt ist. Wenn wir beginnen, die Verbindung zu trennen und die Verbindung wiederherzustellen, nimmt die Anzahl nicht ab.

Ich verwende den node.js und den sockets.io Server auf einem VMware Ubuntu Server.

Weiß jemand, warum dies eine bessere Methode ist, um herauszufinden, wie viele Personen mit dem Server verbunden sind?

37
imperium2335

Es gibt eine github Ausgabe dafür. Das Problem ist, dass, wenn jemand die Verbindung von socket.io abbricht, das Array nicht löscht (splice), sondern einfach den Wert auf "null" setzt. In diesem Array befinden sich also viele NULL-Werte, die Ihre Clients ( länge größer als die Verbindungen, die Sie in Wirklichkeit haben.

Sie müssen eine andere Methode zum Zählen Ihrer Kunden verwenden, z. so etwas wie

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

Es ist ein Verstand, warum die Leute hinter socket.io die Dinge so hinterlassen haben, aber es ist besser zu erklären in der Github-Ausgabe, die ich als Link gepostet habe!

39
drinchev

Nur für den Fall, dass jemand auf diese Seite kommt, während socket.io Version 1.0 verwendet wird

Sie können die Anzahl der verbundenen Clients abrufen

socketIO.engine.clientsCount

Brauchen Sie eine Antwort, und das obige funktionierte nicht für die neue Version von socket.io

56
Ahmad

Ich habe den Weg gefunden, es in Version 1.3.7 herauszufinden. Es gibt drei Methoden:

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

Hoffe das kann jemandem mit dem gleichen Problem helfen. :)

27
Lordran

Warum eine (implizite globale) Variable verwenden, wenn Sie das Array immer filtern könnten, das durch Aufrufen der clients () -Methode zurückgegeben wird?.

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

Ich verwende derzeit Socket.io v1.3.6 und habe festgestellt, dass dies funktioniert. Es gibt eine genaue Anzahl, wenn Benutzer eine Verbindung herstellen und wenn sie die Verbindung trennen:

io.sockets.sockets.length

So wie:

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

Ich benutze socket.io 0.9.10 und den folgenden Code, um die Anzahl der Sockets zu bestimmen:

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

Sie sind nicht sicher, wie genau diese Zahl auf die verschiedenen Edge-Fälle reagiert, aber bis jetzt scheint sie genau zu sein: Jeder Browser, der eine Verbindung herstellt, erhöht die Anzahl, jeder geschlossene Browser verringert sie.

3
dknaus

Werfen Sie auch einen Blick auf:

io.sockets.manager.connected

Es ist eine saubere Liste von Schlüsselwertpaaren (Socket-ID und Verbindungsstatus?)

3
Gilbert Flamino

mit socket.io 2.2.0 ist es einfacher:

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

prost

2
rafa226

Ich sehe keine Erwähnung von Multi-Core-Apps. Ich füge hinzu, dass ich, da ich mehrere Kerne (Cluster) verwende, nicht in der Lage war, die richtige Anzahl von Sockets auf der Clientseite durchgängig zu ermitteln, also landete ich am Ende Speichern sie in meiner Mongo-Instanz und es ist ziemlich konsistent und genau. Mit diesem Ansatz kann ich meine Socket-Verbindungen stilvoll über den Browser anzeigen lassen :). 

Mungo-Schema: 

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

Verwendungszweck:

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

Wie viele habe ich? 

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

HINWEIS * Ich mag es nicht, leere Abfrageobjekte ({}) zu verwenden, deshalb habe ich stattdessen einfach "{socket = 1}" als Dummy verwendet

1
Squivo

Momentan verwende ich Socket v1.4.29 mit TypeScript. Sie können die Anzahl der verbundenen Clients anhand dieser Option ermitteln 

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

Verbundene Benutzer zählen in der Version mit 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