node.js - Recuento de usuarios conectados de Socket.io
websocket (10)
Finalmente conseguí que socket.io funcionara correctamente, pero me encontré con un problema extraño.
No estoy seguro de si esta es la mejor manera, pero estoy usando:
io.sockets.clients().length
Esto devuelve la cantidad de clientes conectados a mi servidor. El problema es después de unos pocos contactos y desconexiones de usuarios, el número comienza a permanecer más alto de lo que debería ser.
Por ejemplo, si me conecto y le pregunto a mis amigos, el número sube, que es el correcto. Pero cuando comenzamos a desconectarnos y reconectar el número, no disminuye.
Estoy ejecutando el servidor node.js y sockets.io en un servidor vmware ubuntu.
¿Alguien sabe por qué es o tiene un mejor método para averiguar cuántas personas están conectadas al servidor?
Los usuarios conectados cuentan en número con la versión de 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
});
¿Por qué usar una variable (implícita global) cuando siempre se puede filtrar la matriz, que se devuelve llamando al método clients ()?
function filterNullValues (i) {
return (i!=null);
}
io.sockets.clients().filter(filterNullValues).length;
Actualmente estoy usando Socket.io v1.3.6 y he descubierto que esto funciona. Proporciona un número preciso cuando los usuarios se conectan y cuando se desconectan:
io.sockets.sockets.length
Al igual que:
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);
});
});
Actualmente estoy usando socket v1.4.29 con typeScript, puedes encontrar la cantidad de clientes conectados al usar esto
io.sockets.on(''connection'', function(socket) {
var clients = socket.client.conn.emit.length;
console.log("clients: " + clients);
});
En caso de que alguien llegue a esta página mientras usa la versión 1.0 de socket.io
Puede obtener el conteo de clientes conectados desde
socketIO.engine.clientsCount
Necesita una respuesta y lo anterior no funcionó para la nueva versión de socket.io
Estoy usando socket.io 0.9.10 y el siguiente código para determinar el número de sockets:
var socketIO = require(''socket.io'').listen( .....
var numberOfSockets = Object.keys(socketIO.connected).length;
No estoy seguro de la precisión con la que este número reacciona a los distintos casos extremos, pero hasta ahora parece exacto: cada navegador que se conecta aumenta el número, cada navegador cerrado lo disminuye.
Hay un problema de github para esto. El problema es que cada vez que alguien desconecta socket.io no elimina (empalma) de la matriz, sino que simplemente establece el valor en "nulo", por lo que de hecho tiene muchos valores nulos en la matriz, lo que hace que sus clientes ( ) .Longitud más grande que las conexiones que tienes en realidad.
Tienes que gestionar una forma diferente de contar a tus clientes, por ejemplo, algo así como
socket.on(''connect'', function() { connectCounter++; });
socket.on(''disconnect'', function() { connectCounter--; });
Es un zumbido mental, ¿por qué las personas detrás de socket.io han dejado las cosas así, pero es mejor explicar en el problema de Github, que publiqué como un enlace!
He encontrado la manera de resolverlo en la versión 1.3.7. Hay tres métodos de la siguiente manera:
-
io.engine.clientsCount
-
io.sockets.sockets.length
-
Object.keys(io.sockets.connected).length
Espero que estos puedan ayudar a alguien con el mismo problema. :)
No veo ninguna mención de aplicaciones multinúcleo, así que solo voy a agregar que dado que estoy usando múltiples núcleos (clusters) no pude obtener la cantidad correcta de tomas de manera consistente en el lado del cliente, así que terminé guardándolos en mi instancia de mongo y es bastante consistente y preciso. Con este enfoque, puedo ver mis conexiones de socket con estilo a través del navegador :).
Esquema de Mongoose:
var socketSchema = mongoose.Schema({
socket : Number
});
Uso:
//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();
}
});
});
});
¿Cuántos tengo?
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 );
}
});
NOTA * No me gusta usar objetos de consulta vacíos ({}) así que acabo de usar {"socket": 1} como un dummy en su lugar
También eche un vistazo a:
io.sockets.manager.connected
Es una lista limpia de los pares clave de valores (id de socket y estado de conexión?)