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;
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
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.
Dans la version 1.4.5
var clientNumber = io.sockets.adapter.rooms[room].length;
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
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.
J'utilise 1.4.6 et cela a fait l'affaire:
Object.keys(io.sockets.connected).length
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;