Socket IO Rooms: получите список клиентов в определенном номере

Я пытаюсь отобразить список клиентов в определенной комнате. Я просто хочу показать свое имя пользователя, а не идентификатор его сокета.

Это где я нахожусь:

socket.set('nickname', "Earl");  
socket.join('chatroom1');
console.log('User joined chat room 1);

var roster = io.sockets.clients('chatroom1');
for ( i in roster )
{
   console.log('Username: ' + roster[i]);   
}

Не повезло, чтобы он отображал идентификаторы Socket ID или что-то еще. Хотелось бы, чтобы он возвращал прозвища.

Ответ 1

Всего несколько вещей.

  • когда у вас есть socket, вы можете затем установить следующие свойства: socket.nickname = 'Earl';, чтобы использовать свойство save, например, в журнале консоли: console.log(socket.nickname);

  • где отсутствует закрывающая цитата (') в вашем:

    console.log('User joined chat room 1);

  • Я не совсем уверен в вашем цикле.

Ниже приведен код с поправкой, который должен помочь вам немного, также помните, что цикл, который я использую ниже, является асинхронным, и это может повлиять на то, как вы обрабатываете передачу данных.

socket.nickname = 'Earl';
socket.join('chatroom1');

console.log('User joined chat room 1');

var roster = io.sockets.clients('chatroom1');

roster.forEach(function(client) {
    console.log('Username: ' + client.nickname);
});

чтобы помочь вам больше, мне нужно будет увидеть весь ваш код, поскольку это не дает мне контекста.

Ответ 2

Для пользователей, использующих версии socket.IO версии 1.0 или выше, приведенный выше ответ может не работать. Для этого обратитесь к следующему ответу. Получить список всех клиентов в определенной комнате

Код для обновления объекта сокета для всех клиентов в комнате

var clients = io.sockets.adapter.rooms['Room Name'].sockets;   

//to get the number of clients
var numClients = (typeof clients !== 'undefined') ? Object.keys(clients).length : 0;

for (var clientId in clients ) {

     //this is the socket of each client in the room.
     var clientSocket = io.sockets.connected[clientId];

     //you can do whatever you need with this
     clientSocket.emit('new event', "Updates");

}

Ответ 3

Вместо того, чтобы углубляться в объект socket/io, вы можете использовать простой и стандартный способ:

io.in(room_name).clients((err , clients) => {
    // clients will be array of socket ids , currently available in given room
});

Для более подробной информации ЧИТАЙТЕ

Ответ 4

Все ответы выше и один здесь socket.io получают номера, в которых сокет находится в настоящее время или здесь Socket.IO - как получить список подключенных сокетов/клиентов? были либо неправильными, либо неполными, если вы используете 2.0.

  • В 2.0 io.sockets.manager или io.sockets.clients больше не существует.
  • Без использования пространства имен следующие 3 параметра могут получить сокеты в определенной комнате.

    socket.adapter.rooms;

    io.sockets.adapter.rooms;

    io.sockets.adapter.sids;//массив socket.id

  • С пространством имен (я использовал здесь "cs" ), io.sockets.adapter.rooms выдадут довольно запутанный результат, и результат socket.adapter.rooms дает правильное значение:

    /* socket.adapter.rooms дают: */

    { "/cs # v561bgPlss6ELZIZAAAB": { "сокеты": { "/cs # v561bgPlss6ELZIZAAAB": true}, "length": 1}, "room xxx": { "sockets": { "/cs # v561bgPlss6ELZIZAAAB": истинно}, "длина": 1}}

    /* io.sockets.adapter.rooms дают: sid без пространства имен */

    { "v561bgPlss6ELZIZAAAB": { "розетки": { "v561bgPlss6ELZIZAAAB": истинно}, "длина": 1}}

Примечание: в комнате по умолчанию это: " Каждый Socket в Socket.IO идентифицируется случайным, неопознанным, уникальным идентификатором Socket # id. удобство, каждый сокет автоматически присоединяется к комнате, идентифицированной этим идентификатором.

Я только пробовал адаптер памяти до сих пор, не пробовал redis-адаптер.

Ответ 5

Для Socket.io более v1.0 и v6. 0+ используйте следующий код:

function getSockets(room) { // will return all sockets with room name
  return Object.entries(io.sockets.adapter.rooms[room] === undefined ?
  {} : io.sockets.adapter.rooms[room].sockets )
    .filter(([id, status]) => status) // get only status = true sockets 
    .map(([id]) => io.sockets.connected[id])
}

Если вы хотите что-то излучать, используйте это:

getSockets('room name').forEach(socket => socket.emit('event name', data))

Ответ 6

Я просто подключил все сокеты в комнате к консоли, вы можете делать с ними все что угодно...

const socketsInRoom = io.adapter.rooms[room_name];

    /*Collect all participants in room*/
    for(let participant in socketsInRoom){
        for(let socketId in socketsInRoom[participant]){
            console.log(socketId)
        }
    }

Ответ 7

socket.io ^ 2.2.0


const socket = io(url)

socket.on('connection', client => {
  socket.of('/').in("some_room_name").clients((err, clients) => {
    console.log(clients) // an array of socket ids
  })
})




Ответ 8

Вы можете создать объект массива пользовательской коллекции как

var users = {};

то на стороне сервера вы можете добавить его как нового пользователя при подключении

socket.on('new-user', function (username) {
    users[username] = username;
});

пока вы показываете пользователей, вы можете зациклировать объект "users"

На стороне клиента

var socket = io.connect();

socket.on('connect', function () {
    socket.emit('new-user', 'username');
});