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?
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!
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
Ich habe den Weg gefunden, es in Version 1.3.7 herauszufinden. Es gibt drei Methoden:
io.engine.clientsCount
io.sockets.sockets.length
Object.keys(io.sockets.connected).length
Hoffe das kann jemandem mit dem gleichen Problem helfen. :)
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;
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);
});
});
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.
Werfen Sie auch einen Blick auf:
io.sockets.manager.connected
Es ist eine saubere Liste von Schlüsselwertpaaren (Socket-ID und Verbindungsstatus?)
mit socket.io 2.2.0 ist es einfacher:
io.on('connection', function (socket) {
console.log( socket.client.conn.server.clientsCount + " users connected" );
});
prost
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
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);
});
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
});