Ответ 1
Если вы используете версию < 1,
var clients = io.sockets.clients(nick.room); // all users from room
У меня есть этот код прямо сейчас, который устанавливает ник и комнату:
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});
});
Мне хотелось узнать, как я могу узнать, сколько людей подключено к определенному чату... например Room.length
клиентская сторона:
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>");
});
});
}
Я нашел это, но он дает undefined:
count = io.rooms[Room].length;
Если вы используете версию < 1,
var clients = io.sockets.clients(nick.room); // all users from room
Для версий socket.io >= 1.0:
Обратите внимание, что комнаты стали актуальными типами с свойством .length
в 1.4, поэтому теперь метод 1.4.x должен быть стабильным.
Чтобы подсчитать всех клиентов, подключенных к '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;
Предполагается, что вы работаете с адаптером комнаты по умолчанию на одном node (в отличие от cluster). Вещи более сложные, если вы находитесь в кластере.
Другие связанные примеры:
Подсчитайте всех клиентов, подключенных к серверу:
var srvSockets = io.sockets.sockets;
Object.keys(srvSockets).length;
Подсчитайте всех клиентов, подключенных к пространству имен '/chat'
:
var nspSockets = io.of('/chat').sockets;
Object.keys(nspSockets).length
Для socket.io 1.4.6 то, что сработало для меня, указывает пространство имен в дополнение к комнате. При использовании пространства имен по умолчанию вы можете просто указать его как ['/']
. Например, чтобы получить количество клиентов, подключенных к комнате "кухня" в пространстве имен по умолчанию (nsps), вы должны написать:
var io = require('socket.io')();
io.nsps['/'].adapter.rooms['kitchen'].length
Heads up: если никто не присоединился к комнате, он еще не создан, поэтому io.nsps['/'].adapter.rooms['kitchen']
вернет undefined
. Если вы попытаетесь вызвать .length
на кухне undefined, ваше приложение выйдет из строя.
В версии 1.4.5
var clientNumber = io.sockets.adapter.rooms[room].length;
Я использую 1.4.6, и это сделало трюк:
Object.keys(io.sockets.connected).length
Я хотел получить список пользователей в комнате. Это оказалось моим решением.
Я добавил свойство username в свой сокет, но для полноты я изменил его на "id", который является идентификатором сокета.
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
Для socket.io v2.0.3, я закончил работать с сервером redis и использовал плагин socket.io-redis. Затем вы можете сделать:
io.of('/').adapter.clients(['room1', 'room2'], (err, clients) => {
console.log(clients); // an array containing socket ids in 'room1' and/or 'room2'
});
код от https://github.com/socketio/socket.io-redis#redisadapterclientsroomsarray-fnfunction
kevzettler указал мне на socket.io-redis
Другой ответ для socket.io v2.0.3 от The Lazy Coder не работал у меня, он дал мне список всех подключенных клиентов, независимо от комнаты.
поместите это в функцию, и это даст вам защиту от сбоев, чтобы предотвратить сбой:
var roomCount = io.nsps['/'].adapter.rooms[roomName];
if (!roomCount) return null;
return roomCount.length;