Как получить список клиентов комнат в socket.io 1.0

Я могу получить список клиентов комнат с этим кодом в socket.io 0.9.

io.sockets.clients(roomName)

Как это сделать в socket.io 1.0?

Ответ 1

Рассмотрите этот более полный ответ, связанный в комментарии выше, на вопрос: 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

Ответ 2

Используя @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.

Если вам нужно, также смотрите этот связанный вопрос, если вы используете пространства имен.

Ответ 3

Для тех из вас, кто использует пространства имен, я создал функцию, которая может обрабатывать разные пространства имен. Это совершенно так же, как ответ нха.

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

Ответ 4

Вы можете увидеть этот запрос github для для обсуждения темы, однако кажется, что эта функция была удалена из 1.0 pre релиз для SocketIO.

Ответ 5

По меньшей мере 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 );
  }); 
}