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