Я пытаюсь получить список всех сокетов / клиентов, которые в данный момент подключены.
io.sockets
не возвращает массив, к сожалению.
Я знаю, что могу сохранить свой собственный список, используя массив, но не думаю, что это оптимальное решение по двум причинам:
Избыточность. Socket.IO уже хранит копию этого списка.
Socket.IO предоставляет метод для установки произвольных значений полей для клиентов (то есть:),
socket.set('nickname', 'superman')
поэтому я должен был бы не отставать от этих изменений, если бы я должен был поддерживать свой собственный список.
Помогите?
socket
это id,io.sockets.sockets[socket]
это сокет.err
и если вы используете хранилище памяти, это всегдаnull
..get('nickname', function(err, nickname) { ... })
Ответы:
В Socket.IO 0.7 у вас есть
clients
метод для пространств имен, который возвращает массив всех подключенных сокетов.API для пространства имен:
Для пространства имен
Надеется, что это поможет кому-то в будущем
ОБНОВЛЕНО 2020 Мар 06
От 1.x и выше, пожалуйста, перейдите по этой ссылке: узнать, сколько человек в чате в socket.io
источник
connected
объект пространства имен.var clients = io.sockets.connected();
очевидно не работает. СпасибоSocket.io 1.4
Object.keys(io.sockets.sockets);
дает вам все подключенные розетки.Socket.io 1.0 Начиная с socket.io 1.0, фактически принятый ответ больше не действителен. Поэтому я сделал небольшую функцию, которую я использую как временное исправление:
Api для Нет имен становится
Api для пространства имен становится:
Также смотрите этот связанный вопрос , в котором я даю функцию, которая возвращает сокеты для данной комнаты.
Socket.io 0.7
API для пространства имен :
Для пространства имен
Примечание. Поскольку кажется, что API socket.io склонен к взлому, а некоторые решения основаны на деталях реализации, это может быть вопросом отслеживания клиентов самостоятельно:
источник
После socket.io 1.0 мы не можем использовать
больше. Вместо этого вы можете использовать следующее
источник
var clients_in_the_room = io.sockets.adapter.rooms[roomId].sockets
Используя Socket.IO 1.x:
Получить массив подключенных клиентов:
Получить количество подключенных клиентов:
источник
Очень просто в socket.io 1.3:
io.sockets.sockets
- это массив, содержащий подключенные объекты сокетов. Если вы сохранили имя пользователя в каждом сокете, вы можете сделать:Boom. У вас есть имена всех подключенных пользователей.
источник
(Object.keys(io.engine.clients)
Я прошел через эту боль сегодня. Socket.io будет намного лучше, если они смогут составить соответствующую документацию для своего API.
Во всяком случае, я попытался заглянуть в io.sockets и нашел несколько вариантов, которые мы можем использовать:
Также обратите внимание, что при использовании socket.io с пространством имен вышеприведенные методы не работают, поскольку io.sockets становится массивом, а не объектом. Чтобы решить, просто замените io.sockets на io (т.е. io.sockets.connected становится io.connected, io.sockets.adapter.rooms становится io.adapter.rooms ...)
Протестировано на socket.io 1.3.5
источник
Версия +2.0
В версии +2.0 вы указываете пространство имен / комнату / узел, к которому вы обращаетесь.
Как и в случае широковещания, по умолчанию используются все клиенты из пространства имен по умолчанию ('/'):
Получает список идентификаторов клиентов, связанных с конкретным пространством имен (по всем узлам, если применимо).
Пример, чтобы получить всех клиентов в комнате пространства имен:
Это из официальной документации: Socket.IO Server-API
источник
socket.username
свойство к каждому сокету при подключении, есть ли способ просмотреть все эти объекты сокетов (включая настраиваемые свойства, которые я добавляю в каждый сокет)? (для справки, в настоящее время я использую глобальную переменную объекта для хранения дополнительной информации о сокете при подключении клиента - поэтому не спрашиваю, как это настроить - просто интересно узнать, есть ли способ просмотреть все объекты сокета по умолчанию) ,console.log(io.sockets.connected)
- это , кажется, объект , где каждое значение свойства является «сокет объект» , который содержит эти свойстваnsp
,server
,adaptor
,id
(строка),client
,conn
,rooms
,acks
,connected
,disconnected
,handshake
,fns
,flags
,_rooms
,_events
,_eventsCount
и , наконец ,username
что является пользовательским свойством я добавить к каждому разъему подключения.Я думаю, что мы можем получить доступ к объекту сокета с сервера, и вы можете назначить псевдоним и указать его идентификатор сокета,
На
disconnect
пожалуйста , удалите псевдоним изio.sockets.sockets
.источник
Это лучший способ получить к нему доступ в socket.io 1.3
Object.keys(socket.adapter.rooms[room_id])
источник
var room = io.sockets.adapter.rooms[room_id];
var connections = _.map(Object.keys(room), function(socketId){ return (io.sockets.connected[socketId].connected == true) });
Для тех, кто просто хочет COUNT подключенных клиентов, я верю, что это сделает это:
io.sockets.manager.server.connections
источник
io.sockets.clients().length
io.sockets.manager.server.connections
иio.sockets.clients().length
не работают. Это сработало для меня - только для подсчета -io.engine.clientsCount
и для списка клиентов -io.engine.clientsCount
. Так как он остается таким более 3 лет. Похоже, надежный способ получить информацию о соединении. (Основано на ответеSocket.io 1.4.4
Пример кода для вас.
Думаю, кому-то поможет этот блок кода.
источник
В Socket.IO 1.4
Чтобы получить массив всех подключенных пользователей:
Чтобы получить количество всех клиентов:
источник
Начиная с socket.io 1.5, обратите внимание на изменение индекса indexOf, которое, по-видимому, обесценилось и заменено значением valueOf.
Для socket.io версии 2.0.3 работает следующий код:
источник
на socket.io 1.3 я выполнил это в 2 строки
источник
Socket.io 1.7.3 (+):
источник
Для версии 2.3 это работает, и это также даст вам сокет , мне кажется, что socketIo меняется слишком быстро и слишком мало для читаемой документации после некоторого использования.
до сих пор это не чувствует себя хорошо, как у меня всегда это чувство с сокетом Io как-то
источник
Я полагаю, вы можете получить доступ к этому из свойства менеджера сокета?
источник
Здесь я вижу много хороших ответов, и многие из них весьма полезны, но не совсем то, что мне нужно. Я использую сокеты для функции pubsub, в которой заинтересованный клиент может прослушивать любые изменения в данной записи.
Моя конкретная проблема заключалась в том, что одна и та же розетка несколько раз входила в одну и ту же комнату. Решение этой проблемы состояло в том, чтобы проверить, есть ли у сокета комната в собственности комнат.
Надеюсь, это кому-нибудь поможет.
источник
Это самый простой способ в Socket.IO 1.0+, если вы не используете пространства имен или комнаты.
Это смотрит на пространство имен по умолчанию и определяет длину массива сокетов, без необходимости использования
Object.keys()
источник
Начиная с версии 1.5.1, я могу получить доступ ко всем сокетам в пространстве имен с помощью:
По какой-то причине они используют простой объект вместо массива для хранения идентификаторов сокетов.
источник
of()
в этом случае вы можете полностью удалить цепочку вызовов.Для режима кластера, используя Redis-адаптер
Поскольку каждый сокет является комнатой, можно найти, существует ли сокет, используя тот же.
источник
Вот быстрый способ преобразования хэша подключенных сокетов из пространства имен в массив с использованием генераторов ES6 (применяется к socket.io> = v1.0.0):
источник
Я не знаю, если это все еще происходит. Но что-то вроде этого я и использовал (я сохраняю объект сеанса на каждом подключенном сокете, который, в свою очередь, содержит имя пользователя и другую информацию:
источник
Если в проекте есть кластер socket.io, это означает, что используется адаптер socket.io-redis .
В случае, подобном описанному выше, процесс получения идентификатора всех подключенных сокетов должен выполняться через адаптер socket.io-redis . Приведенные ниже примеры могут быть использованы для этого;
Пожалуйста, посетите сайт socket.io-redis github для более подробной информации.
источник
socket.io@1.7.3
Я использовал Object.Keys, чтобы подключить массив сокетов. Затем в том же массиве итерации с функцией карты, чтобы построить новый массив объектов
Возможно, этот ответ поможет получить массив идентификатора сокета / имени пользователя.
источник
v.10
источник
socket.io 2.1.1
, я получаю ,TypeError: clients.map is not a function
и , хотя это выглядит многообещающим, я не совсем уверен , что в приведенном выше примере будет достичь - я надеялся , что это будет автоматически создать массив объектов клиента с логинами включены :).