143 votes

Socket.IO - Comment puis-je obtenir une liste des sockets/clients connectés ?

Je vais essayer d'obtenir une liste de tous les sockets/clients actuellement connectés.

io.sockets ne pas retourner un tableau, malheureusement.

Je sais que je pourrais garder mon propre liste à l'aide d'un tableau, mais ne pense pas que c'est une solution optimale pour 2 raisons:

  1. La redondance. Socket.IO déjà conserve une copie de cette liste.

  2. Socket.IO fournit une méthode pour fixer arbitrairement les valeurs de champ pour les clients (j'.e: socket.set('nickname', 'superman')) donc j'aurais besoin pour faire face à ces changements si j'étais à maintenir mon propre liste.

De l'aide?

163voto

3rdEden Points 2697

Dans Socket.IO 0.7, vous avez une méthode clients sur les espaces de noms, cela retourne un tableau de tous les sockets connectés.

API pour aucun espace de nom:

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

Pour un espace de noms

 var clients = io.of('/chat').clients();
var clients = io.of('/chat').clients('room'); // all users from room `room`
 

Espère que cela aide quelqu'un à l'avenir

96voto

nha Points 898

Que de la prise.io 1.0, le réel accepté enswer n'est pas plus valable. J'ai donc fait une petite fonction que j'utilise comme une solution temporaire :

function findClientsSocket(roomId, namespace) {
    var res = []
    , ns = io.of(namespace ||"/");    // the default namespace is "/"

    if (ns) {
        for (var id in ns.connected) {
            if(roomId) {
                var index = ns.connected[id].rooms.indexOf(roomId) ;
                if(index !== -1) {
                    res.push(ns.connected[id]);
                }
            } else {
                res.push(ns.connected[id]);
            }
        }
    }
    return res;
}

Api pour Aucun espace de noms devient

// var clients = io.sockets.clients();
// becomes : 
var clients = findClientsSocket() ;

// var clients = io.sockets.clients('room'); // all users from room `room`
// becomes
var clients = findClientsSocket('room') ;

Api pour un espace de noms devient :

// var clients = io.of('/chat').clients();
// becomes
var clients = findClientsSocket(null, '/chat') ;

// var clients = io.of('/chat').clients('room'); // all users from room `room`
// becomes
var clients = findClientsSocket('room', '/chat') ;

Voir aussi cette question connexe, à qui je donne une fonction qui renvoie les sockets pour une pièce donnée.

function findClientsSocketByRoomId(roomId) {
var res = []
, room = io.sockets.adapter.rooms[roomId];
if (room) {
    for (var id in room) {
    res.push(io.sockets.adapter.nsp.connected[id]);
    }
}
return res;
}

46voto

salihcenap Points 451

Après socket.io 1.0, nous ne pouvons pas utiliser

 io.sockets.clients(); 
or
io.sockets.clients('room'); 
 

plus. Au lieu de cela, vous pouvez utiliser ce qui suit

 var clients_in_the_room = io.sockets.adapter.rooms[roomId]; 
for (var clientId in clients_in_the_room ) {
  console.log('client: %s', clientId); //Seeing is believing 
  var client_socket = io.sockets.connected[clientId];//Do whatever you want with this
}
 

17voto

sunil n jose Points 129

Je pense que nous pouvons accéder à l'objet socket depuis le serveur, et vous pouvez attribuer le surnom et pointer son identifiant de socket,

 io.sockets.on('connection',function(socket){ 
    io.sockets.sockets['nickname'] = socket.id;
    client.on("chat", function(data) {      
        var sock_id = io.sockets.sockets['nickname']
        io.sockets.sockets[sock_id].emit("private", "message");
    });    
});
 

Sur disconnect , supprimez le pseudo de io.sockets.sockets .

5voto

crickeys Points 546

Pour ceux qui veulent juste un nombre de clients connectés, je crois que cela va le faire:

io.sockets.manager.server.connections

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X