web-dev-qa-db-fra.com

obtenir combien de personnes sont dans une salle de chat dans socket.io

J'ai ce code en ce moment qui définit le pseudo et la pièce:

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

Je voulais savoir comment je pouvais obtenir combien de personnes sont connectées à une salle de discussion spécifique ... comme Room.length

côté client : 

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

J'ai trouvé ça, mais ça donne undefined:

count = io.rooms[Room].length;
33
re1man

Pour les versions de socket.io> = 1.0:

Notez que les pièces sont devenues des types réels avec une propriété .length dans 1.4, la méthode 1.4.x devrait donc être stable à partir de maintenant.

Pour compter tous les clients connectés à '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:

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

En supposant que vous exécutiez l'adaptateur room par défaut sur un seul nœud (par opposition à cluster ). Les choses sont plus compliquées si vous êtes dans un cluster.


Autres exemples connexes:

  • Comptez tous les clients connectés au serveur:

    var srvSockets = io.sockets.sockets;
    Object.keys(srvSockets).length;
    
  • Compter tous les clients connectés à l'espace de noms '/chat':

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

Pour socket.io 1.4.6, ce qui a fonctionné pour moi, c’est de spécifier l’espace de nom en plus de la salle. Lorsque vous utilisez l'espace de noms par défaut, vous pouvez simplement le spécifier en tant que ['/']. Par exemple, pour obtenir le nombre de clients connectés à la «cuisine» de la pièce dans l'espace de noms par défaut (nsps), vous pouvez écrire:

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

Attention: si personne n'a rejoint une salle, celle-ci n'a pas encore été créée. Par conséquent, io.nsps['/'].adapter.rooms['kitchen'] renverra undefined. Si vous essayez d'appeler .length dans la cuisine non définie, votre application va se bloquer.

6
Iron John Bonney

Dans la version 1.4.5

var clientNumber = io.sockets.adapter.rooms[room].length;
5
Márton Vető

Je voulais obtenir une liste d'utilisateurs dans une pièce. Cela a fini par être ma solution.

J'ai ajouté une propriété de nom d'utilisateur à mon socket, mais par souci d'exhaustivité, j'ai changé cela en "id" qui est l'identifiant du 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

1
The Lazy Coder

Pour socket.io v2.0.3, j'ai fini par exécuter un serveur Redis et utiliser le plugin socket.io-redis. Ensuite, vous pouvez faire:

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

le code provient de https://github.com/socketio/socket.io-redis#redisadapterclientsroomsarray-fnfunction

kevzettler m'a pointé vers socket.io-redis


L'autre réponse pour socket.io v2.0.3 de The Lazy Coder n'a pas fonctionné pour moi, elle m'a donné une liste de tous les clients connectés, quelle que soit la pièce.

1
Dries Cleymans

J'utilise 1.4.6 et cela a fait l'affaire:

Object.keys(io.sockets.connected).length
0
Alex Klibisz

mettez cela dans une fonction et vous obtiendrez une sécurité totale pour éviter les plantages:

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