Socket.io получите номера, в которых

Возможно ли получить номера, в которые в данный момент находится сокет, не вызывая

io.sockets.clients(roomName)

для названия каждой комнаты и поиска этого сокета в результатах

Ответ 2

В версии socket.io версии 1+ синтаксис:

socket.rooms

Ответ 3

socket.io 1.7.3 +

Object.keys( io.sockets.adapter.sids[socket.id] )
// returns [socket.id, room-x'] || [socket.id, 'room-1', 'room-2', ...]

Ответ 4

При использовании адаптера, отличного от стандартного, например socket.io-redis, socket.rooms, похоже, не делает этого. То, как мне удалось получить номера для конкретного клиента без цикла, было использовать io.sockets.adapter.sids[socket.id], который возвращает комнаты как объект.

{ 'R-ZRgSf7h4wfPatcAAAC': true, ROOM: true, ROOM_2: true }

Обратите внимание, что это не список сокетов для других процессов, хотя!

socket.io v1.3.7, socket.io-redis 1.0.0

Ответ 5

Версия 1.7.3, socket.rooms содержит socket.id, поэтому удалите ее и получите список комнат:

Object.keys(socket.rooms).filter(item => item!=socket.id);

В другой версии вы можете распечатать socket и найти номера.

Ответ 6

socket.io 1.7.3 +

var currentRoom = socket.rooms[Object.keys(socket.rooms)[0]];//returns name of room

Ответ 7

Версия 2.0.3

io.sockets.sockets[yourSocketID].rooms

То, что совпадает с

socket.rooms

Ответ 8

Вы можете сохранить комнату в самом гнезде, когда она присоединяется к комнате

// join room
socket.join(room);

// update socket rooms
if (socket.rooms) {
    socket.rooms.push(room);
} else {
    socket.rooms = [room];
}

Позже вы можете получить все номера, в которые есть сокет, просто

socket.rooms

Ответ 9

Убедитесь, что сокет находится только в одной комнате за раз, мое решение было:

var currentRoom = Object.keys(io.sockets.adapter.sids[socket.id]).filter(item => item!=socket.id);

Ответ 10

1.4.5 version = > io.sockets.adapter.rooms[roomname].sockets