2012-02-19 26 views
27

tengo este código en este momento que establece el nick y sala:conseguir cuántas personas se encuentran en una sala de chat en socket.io

io.sockets.on('connection', function(client){ 
    var Room = ""; 
    client.on("setNickAndRoom", function(nick, fn){ 
     client.join(nick.room); 
     Room = nick.room; 
     client.broadcast.to(Room).emit('count', "Connected:" + " " + count); 
     fn({msg :"Connected:" + " " + count}); 
    }); 

que quería saber cómo podría conseguir cuántas personas están conectadas a una sala de chat específica ... como Room.length

lado del cliente:

function Chat(){ 
    this.socket = null; 
    this.Nickname = ""; 
    this.Room = ""; 
    var synched = $('#syncUp'); 
    this.Connect = function(nick, room){ 
     socket = io.connect('http://vybeing.com:8080');  
     Nickname = nick; 
     Room = room; 
     //conectarse 
     socket.on('connect',function (data) { 
      socket.emit('setNickAndRoom', {nick: nick, room: room}, function(response){ 
       $("#connection").html("<p>" + response.msg + "</p>"); 
      }); 
     }); 
} 

me encontré con esto, pero da indefinido:

count = io.rooms[Room].length; 
+0

algo más de información sería bueno, se hace la conexión a un servidor IRC regular o en un programa de servidor de chat a medida? –

+0

programa de servidor de chat – re1man

+0

+1. Parece que debería ser más fácil de lo que es. – kdbanman

Respuesta

21

Si está utilizando la versión < 1,

var clients = io.sockets.clients(nick.room); // all users from room

+5

solo un recordatorio, esto devolverá una matriz de los enchufes en la habitación. Para obtener la cantidad de personas en la sala, asegúrese de agregar .length al código anterior – levi

+0

Justo lo que estaba buscando. ¡Gracias! –

+7

'io.sockets' devuelve el' Espacio de nombres' predeterminado (''/''). A partir de socket.io 1.0.x, 'Namespaces' no tiene un método' .clients() '. Acabo de probarlo, 'io.sockets.clients === undefined'. Esta respuesta ya no funcionará. – kdbanman

69

Para Socket.IO versiones> = 1.0:

cuenta que las habitaciones se convirtieron en los tipos reales con una propiedad .length en 1.4, por lo que el método 1.4.x debería ser estable a partir de ahora.

para contar todos los clientes conectados a 'my_room':

1.4+:

var room = io.sockets.adapter.rooms['my_room']; 
room.length; 

1.3.x:

var room = io.sockets.adapter.rooms['my_room']; 
Object.keys(room).length; 

1.0.x 1.2.x: a

var room = io.adapter.rooms['my_room']; 
Object.keys(room).length; 

Esto es asumiendo que estás corriendo con default room adapter en un solo nodo (a diferencia de cluster). Las cosas son more complicated si estás en un clúster.


Otros ejemplos relacionados:

  • Count todos los clientes conectados al servidor:

    var srvSockets = io.sockets.sockets; 
    Object.keys(srvSockets).length; 
    
  • Count todos los clientes conectados al espacio de nombres '/chat':

    var nspSockets = io.of('/chat').sockets; 
    Object.keys(nspSockets).length 
    
3

En la versión 1.4.5

var clientNumber = io.sockets.adapter.rooms[room].length; 
0

estoy usando 1.4.6 y esto hizo el truco:

Object.keys(io.sockets.connected).length 
+0

Este método simplemente cuenta en single nodejs. – tuananh

+0

Esto contará todos los clientes conectados en todas las habitaciones. – talent

6

Para socket.io 1.4.6, lo que funcionó para mí es especificar el espacio de nombres además de la habitación. Cuando use el espacio de nombre predeterminado, puede simplemente especificarlo como ['/'].Por ejemplo, para obtener el número de clientes conectados a la sala de 'cocina' en el espacio de nombres predeterminado (NSP), podría escribir:

var io = require('socket.io')(); 
io.nsps['/'].adapter.rooms['kitchen'].length 

Heads up: Si nadie se ha unido a una habitación, no tiene creado aún, por lo tanto io.nsps['/'].adapter.rooms['kitchen'] devolverá undefined. Si intenta llamar al .length en la cocina no definida, su aplicación se bloqueará.

+0

Genial, gracias hombre! – furcicm

0

Quería obtener una lista de usuarios en una habitación. Esto terminó siendo mi solución.

Agregué una propiedad de nombre de usuario a mi socket, pero para completarla cambié eso a "id" que es la identificación del socket.

var sockets = io.in("room_name") 
Object.keys(sockets.sockets).forEach((item) => { 
    console.log("TODO: Item:", sockets.sockets[item].id)    
}) 

Socket.io v2.0.3

0

Para socket.io v2.0.3, terminé corriendo un servidor Redis y el uso de plug-in socket.io-Redis. A continuación, puede hacer:

io.of('/').adapter.clients(['room1', 'room2'], (err, clients) => { 
    console.log(clients); // an array containing socket ids in 'room1' and/or 'room2' 
}); 

código es de https://github.com/socketio/socket.io-redis#redisadapterclientsroomsarray-fnfunction

kevzettler me señaló a Socket.IO-Redis


La otra respuesta para socket.io v2.0.3 de The Lazy Coder no funcionó para mí, me dio una lista de todos los clientes conectados, independientemente de la habitación.

-1

poner esto en una función y que le dará prueba de fallos para evitar estrellarse:

var roomCount = io.nsps['/'].adapter.rooms[roomName]; 
if (!roomCount) return null; 
return roomCount.length; 
Cuestiones relacionadas