Я могу получить список клиентов комнат с этим кодом в socket.io 0.9.
io.sockets.clients(roomName)
Как это сделать в socket.io 1.0?
Я могу получить список клиентов комнат с этим кодом в socket.io 0.9.
io.sockets.clients(roomName)
Как это сделать в socket.io 1.0?
Рассмотрите этот более полный ответ, связанный в комментарии выше, на вопрос: fooobar.com/questions/46937/...
Клиентов в комнате можно найти в
io.nsps[yourNamespace].adapter.rooms[roomName]
Это ассоциативный массив с ключами, которые являются идентификаторами сокетов. В нашем случае мы хотели узнать количество клиентов в комнате, поэтому мы сделали Object.keys(io.nsps[yourNamespace].adapter.rooms[roomName]).length
Если вы не видели/не использовали пространства имен (например, этот парень [меня]), вы можете узнать о них здесь http://socket.io/docs/rooms-and-namespaces/ (важно: пространство имен по умолчанию равно '/')
Обновлено (особенно для @Zettam):
проверить это репо, чтобы увидеть это: https://github.com/thegreatmichael/socket-io-clients
Используя @ryan_Hdot ссылку, я сделал небольшую временную функцию в своем коде, что позволяет избежать исправления. Вот он:
function getClient(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;
}
Если используется пространство имен:
function getClient (ns, id) {
return io.nsps[ns].adapter.rooms[id]
}
Что я использую как временное исправление для io.sockets.clients(roomId)
, которое становится findClientsSocketByRoomId(roomId)
.
EDIT:
В большинстве случаев стоит подумать об избежании использования этого метода, если это возможно.
То, что я делаю сейчас, это то, что я обычно помещаю клиента в свою комнату (т.е. в комнату, имя которой это clientID). Я нашел код более читаемым таким образом, и мне больше не нужно полагаться на это обходное решение.
Кроме того, я не тестировал это с помощью адаптера Redis.
Если вам нужно, также смотрите этот связанный вопрос, если вы используете пространства имен.
Для тех из вас, кто использует пространства имен, я создал функцию, которая может обрабатывать разные пространства имен. Это совершенно так же, как ответ нха.
function get_users_by_room(nsp, room) {
var users = []
for (var id in io.of(nsp).adapter.rooms[room]) {
users.push(io.of(nsp).adapter.nsp.connected[id]);
};
return users;
};
Вы можете увидеть этот запрос github для для обсуждения темы, однако кажется, что эта функция была удалена из 1.0 pre релиз для SocketIO.
По меньшей мере 1.4.5 nhas-метод тоже не работает, и до сих пор нет публичного api для получения клиентов в комнате. Вот что работает для меня.
io.sockets.adapter.rooms[roomId]
возвращает объект, имеющий два свойства, сокеты и длину. Первый - это еще один объект, который имеет socketIds для ключей и имеет значение boolean как значения:
Room {
sockets:
{ '/#vQh0q0gVKgtLGIQGAAAB': true,
'/#p9Z7l6UeYwhBQkdoAAAD': true },
length: 2 }
Итак, мой код для получения клиентов выглядит следующим образом:
var sioRoom = io.sockets.adapter.rooms[roomId];
if( sioRoom ) {
Object.keys(sioRoom.sockets).forEach( function(socketId){
console.log("sioRoom client socket Id: " + socketId );
});
}