Estou tentando obter uma lista de todos os soquetes / clientes que estão conectados no momento.
io.sockets
infelizmente não retorna uma matriz.
Sei que poderia manter minha própria lista usando uma matriz, mas não acho que essa seja uma solução ideal por 2 motivos:
Redundância. O Socket.IO já mantém uma cópia desta lista.
O Socket.IO fornece um método para definir valores de campo arbitrários para clientes (ou seja:),
socket.set('nickname', 'superman')
para que eu precise acompanhar essas alterações se quiser manter minha própria lista.
Socorro?
socket
é id,io.sockets.sockets[socket]
é o soquete.err
e, se você estiver usando armazenamento de memória, é semprenull
..get('nickname', function(err, nickname) { ... })
Respostas:
No Socket.IO 0.7, você tem um
clients
método nos espaços para nome, isso retorna uma matriz de todos os soquetes conectados.API para nenhum espaço de nome:
Para um espaço para nome
Espera que isso ajude alguém no futuro
ATUALIZAÇÃO 2020 Mar 06
A partir da 1.xe acima, consulte este link: obter quantas pessoas estão em uma sala de bate-papo no socket.io
fonte
connected
objeto do espaço para nome.var clients = io.sockets.connected();
obviamente não funciona. ObrigadoSocket.io 1.4
Object.keys(io.sockets.sockets);
fornece todos os soquetes conectados.Socket.io 1.0 A partir do socket.io 1.0, a resposta realmente aceita não é mais válida. Então, eu criei uma pequena função que eu uso como uma correção temporária:
A API para No namespace se torna
A API para um espaço de nome se torna:
Veja também esta questão relacionada , na qual dou uma função que retorna os soquetes para uma determinada sala.
Socket.io 0.7
API para nenhum espaço de nome :
Para um espaço para nome
Nota: Como parece que a API socket.io está sujeita a falhas, e algumas soluções dependem de detalhes de implementação, pode ser uma questão de rastrear os clientes:
fonte
Após o socket.io 1.0, não podemos usar
não mais. Em vez disso, você pode usar o seguinte
fonte
var clients_in_the_room = io.sockets.adapter.rooms[roomId].sockets
Usando o Socket.IO 1.x:
Obtenha a matriz dos clientes conectados:
Obtenha o número de clientes conectados:
fonte
Muito simples no socket.io 1.3:
io.sockets.sockets
- é uma matriz que contém os objetos de soquete conectados. Se você armazenou o nome de usuário em cada soquete, poderá:Estrondo. Você tem os nomes de todos os usuários conectados.
fonte
(Object.keys(io.engine.clients)
Eu passei por essa dor hoje. O Socket.io será muito melhor se eles puderem criar uma documentação adequada para sua API.
Enfim, tentei examinar o io.sockets e encontrei várias opções que podemos usar:
Além disso, observe que, ao usar o socket.io com espaço para nome, os métodos acima serão interrompidos, pois io.sockets se torna uma matriz em vez de um objeto. Para resolver, basta substituir io.sockets por io (ou seja, io.sockets.connected se torna io.connected, io.sockets.adapter.rooms se torna io.adapter.rooms ...)
Testado em socket.io 1.3.5
fonte
Versão +2.0
Na versão +2.0, você especifica o espaço para nome / sala / nó no qual está consultando.
Como na transmissão, o padrão são todos os clientes do espaço para nome padrão ('/'):
Obtém uma lista de IDs de clientes conectados a um namespace específico (em todos os nós, se aplicável).
Um exemplo para obter todos os clientes na sala de namespace:
Isto é da documentação oficial: Socket.IO Server-API
fonte
socket.username
propriedade a cada soquete na conexão, há uma maneira de exibir todos esses objetos de soquete (incluindo as propriedades personalizadas adicionadas a cada soquete)? (para referência, atualmente estou usando uma variável de objeto global para armazenar informações adicionais de soquete quando um cliente se conecta - portanto, não perguntando como configurá-las - apenas interessado em saber se existe uma maneira de exibir todos os objetos de soquete por 'padrão') .console.log(io.sockets.connected)
- parece ser um objeto, onde cada valor de propriedade é um "objeto socket" que contém essas propriedadesnsp
,server
,adaptor
,id
(a string),client
,conn
,rooms
,acks
,connected
,disconnected
,handshake
,fns
,flags
,_rooms
,_events
,_eventsCount
e, finalmente,username
o que é a propriedade costume adicionar a cada tomada na conexão.Acho que podemos acessar o objeto de soquete do servidor, e você pode atribuir o apelido e apontar seu ID de soquete,
Em
disconnect
, remova o apelido deio.sockets.sockets
.fonte
Esta é a melhor maneira de acessá-lo no socket.io 1.3
Object.keys(socket.adapter.rooms[room_id])
fonte
var room = io.sockets.adapter.rooms[room_id];
var connections = _.map(Object.keys(room), function(socketId){ return (io.sockets.connected[socketId].connected == true) });
Para qualquer pessoa que queira apenas uma CONTAGEM de clientes conectados, acredito que isso será possível:
io.sockets.manager.server.connections
fonte
io.sockets.clients().length
io.sockets.manager.server.connections
eio.sockets.clients().length
não trabalham. Isso funcionou para mim - apenas para contagem -io.engine.clientsCount
e para a lista de clientes -io.engine.clientsCount
. Desde que permaneceu assim por mais de 3 anos. Parece uma maneira confiável de obter as informações de conexão. (Baseado na resposta de Joseph Dykstra)Socket.io 1.4.4
Código de exemplo para você.
Eu acho que vai ajudar alguém nesse bloco de código.
fonte
No Socket.IO 1.4
Para obter a matriz de Todos os usuários conectados:
Para obter a contagem de todos os clientes:
fonte
No socket.io 1.5, observe a alteração de indexOf que parece depreciada e substituída por valueOf
Para socket.io versão 2.0.3, o seguinte código funciona:
fonte
no socket.io 1.3 eu consegui isso em 2 linhas
fonte
Socket.io 1.7.3 (+):
fonte
Para a versão 2.3, isso funciona e você também recebe o soquete , parece-me que o socketIo está mudando muito rápido e muito com pouca documentação legível depois de usá-lo por um tempo.
ainda assim isso não parece certo, pois sempre tenho esse sentimento com o soquete Io
fonte
Eu acredito que você pode acessar isso a partir da propriedade do gerenciador do soquete?
fonte
Eu vejo muitas respostas boas aqui e muitas onde são úteis, mas não exatamente o que eu precisava. Estou usando soquetes para um recurso de pubsub no qual um cliente interessado pode ouvir as alterações em um determinado registro.
Meu problema específico era que o mesmo soquete estava entrando na mesma sala várias vezes. A solução para isso foi verificar se o soquete já tinha o quarto dentro da propriedade de seus quartos.
Espero que isso ajude alguém.
fonte
Essa é a maneira mais simples do Socket.IO 1.0+, se você não estiver usando espaços ou espaços para nome.
Isso examina o espaço para nome padrão e determina o comprimento da matriz de soquetes, sem a necessidade de usar
Object.keys()
fonte
A partir da versão 1.5.1, eu posso acessar todos os soquetes em um espaço para nome com:
Por alguma razão, eles estão usando um objeto simples em vez de uma matriz para armazenar os IDs de soquete.
fonte
of()
chamada em cadeia nesse caso.Para o modo de cluster, usando o adaptador redis
Como cada soquete é uma sala, é possível descobrir se existe um soquete usando o mesmo.
fonte
Aqui está uma maneira rápida de converter o hash de soquetes conectados de um espaço para nome em uma matriz usando geradores ES6 (aplica-se a socket.io> = v1.0.0):
fonte
Não sei se isso ainda está acontecendo. Mas algo assim foi o que acabei usando (mantenho um objeto de sessão em cada soquete conectado, que por sua vez contém o nome de usuário e outras informações:
fonte
Se o projeto tiver um cluster socket.io, isso significa que o adaptador socket.io-redis está sendo usado.
Se o caso for o anterior, é necessário aplicar o processo de identificação de todos os soquetes conectados por meio do adaptador socket.io-redis . Os exemplos abaixo podem ser usados para isso;
Visite a página do socket.io-redis no github para obter mais detalhes.
fonte
[email protected]
Eu usei Object.Keys para obter a matriz do soquete conectada. Na mesma matriz, itere a função map para criar uma nova matriz de objetos
Talvez esta resposta possa ajudar a obter o array socket id / username.
fonte
v.10
fonte
socket.io 2.1.1
, receboTypeError: clients.map is not a function
e, embora pareça promissor, não tenho muita certeza do que o exemplo acima alcançará - eu esperava que ele criasse automaticamente uma matriz de objetos cliente com nomes de usuário incluídos :).