Socket.IO - как получить список подключенных сокетов / клиентов? - PullRequest
139 голосов
/ 03 июля 2011

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

io.sockets не возвращает массив, к сожалению.

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

  1. Избыточность. Socket.IO уже хранит копию этого списка.

  2. Socket.IO предоставляет метод для установки произвольных значений полей для клиентов (то есть: socket.set('nickname', 'superman')), поэтому мне нужно было бы не отставать от этих изменений, если бы я должен был поддерживать свой собственный список.

Помощь

Ответы [ 26 ]

1 голос
/ 08 августа 2017

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

ioSite.of('/').in(roomId).clients((error, clients) => {
    if (error) throw error;
    for (var i=0;i<clients.length;i++) {
        clientId=clients[i];
        console.log(clientId);

        // load the socket of your namespace
        var socket=ioSite.of('/').in(roomId).connected[clientId]
        console.log(socket.constructor.name);
        console.log(socket.id);
    }
});

все же это не правильно, так как у меня всегда такое чувство с сокетом Io как-то

0 голосов
/ 02 октября 2018

v.10

var clients = io.nsps['/'].adapter.rooms['vse'];
/* 
'clients' will return something like:
Room {
sockets: { '3kiMNO8xwKMOtj3zAAAC': true, FUgvilj2VoJWB196AAAD: true },
length: 2 }
*/
var count = clients.length;  // 2
var sockets = clients.map((item)=>{  // all sockets room 'vse'
       return io.sockets.sockets[item];
      });
sample >>>
var handshake  = sockets[i].handshake; 
handshake.address  .time .issued ... etc.
0 голосов
/ 07 сентября 2018

socket.io@1.7.3

Я использовал Object.Keys, чтобы подключить массив сокетов.Затем в том же массиве выполните итерацию с функцией map для создания нового массива объектов

var connectedUsers = Object.keys(io.sockets.connected).map(function(socketId) {
    return { socket_id : socketId, socket_username: io.sockets.connected[socketId].username };
});

// test
console.log(connectedUsers);

Возможно, этот ответ поможет получить массив идентификаторов сокетов / имен пользователей.

0 голосов
/ 27 сентября 2015

Вот быстрый способ преобразования хэша подключенных сокетов из пространства имен в массив с использованием генераторов ES6 (применяется к socket.io> = v1.0.0):

io.on('connection', function(socket) {
  var hash = io.of('/').connected
  var list = null

  hash[Symbol.iterator] = function*() {
    // for..of loop to invoke Object.keys() default iterator
    // to get the array values instead of the keys
    for(var id of Object.keys(hash)) yield hash[id]
  }

  list = [...hash]
  console.log(Array.isArray(list)) // true
})
0 голосов
/ 29 марта 2017

Если в проекте есть кластер socket.io , это означает, что используется адаптер socket.io-redis .

В случае, подобном описанному выше, процесс получения идентификатора всех подключенных сокетов должен выполняться через адаптер socket.io-redis . Для этого могут быть использованы следующие примеры:

io.of('/').adapter.clients(function (err, clients) {
  console.log("clients: ", clients); // an array containing all connected socket ids
});


io.of('/').adapter.allRooms(function (err, rooms) {
  console.log("all rooms: ", rooms);
});

Пожалуйста, посетите socket.io-redis github страницу для более подробной информации.

0 голосов
/ 07 июня 2016

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

var connectedUsers = Object.keys(io.sockets.connected).map(function(socketId) {
    return io.sockets.connected[socketId].session.username;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...