Estou trabalhando com socket.io e node.js e até agora parece muito bom, mas não sei como enviar uma mensagem do servidor para um cliente específico, algo como isto:
client.send(message, receiverSessionId)
Mas .send()
nem os .broadcast()
métodos nem parecem suprir minha necessidade.
O que eu descobri como uma solução possível é que o .broadcast()
método aceita como segundo parâmetro uma matriz de SessionIds para a qual não envia a mensagem, para que eu pudesse passar uma matriz com todos os SessionIds conectados naquele momento ao servidor, exceto aquele Desejo enviar a mensagem, mas sinto que deve haver uma solução melhor.
Alguma ideia?
fonte
A resposta de Ivo Wetzel não parece mais válida no Socket.io 0.9.
Em suma, agora você deve salvar
socket.id
e usario.sockets.socket(savedSocketId).emit(...)
para enviar mensagens a ele.Foi assim que consegui isso funcionando no servidor Node.js. clusterizado:
Primeiro, você precisa definir o armazenamento Redis como o armazenamento para que as mensagens possam passar por processos:
Omiti o código de cluster aqui, porque isso fica mais confuso, mas é trivial adicionar. Basta adicionar tudo ao código do trabalhador. Mais documentos aqui http://nodejs.org/api/cluster.html
fonte
io.of('/mynamespace').sockets[socketID].emit(...)
(não sei se é porque eu estou usando um namespace)io.sockets.socket(socket_id)
é removido no socket.io 1.0. github.com/socketio/socket.io/issues/1618#issuecomment-46151246cada soquete se junta a uma sala com um ID de soquete para um nome, para que você possa apenas
docs: http://socket.io/docs/rooms-and-namespaces/#default-room
Felicidades
fonte
io.sockets.connected[socketid].emit();
. Testado com 1.4.6.A solução mais simples e elegante
É tão fácil quanto:
E é isso.
Mas como? Me dê um exemplo
O que todos nós precisamos é de fato um exemplo completo, e é isso que se segue. Isso é testado com a versão mais recente do socket.io (2.0.3) e também usa o Javascript moderno (que todos nós deveríamos estar usando agora).
O exemplo é composto de duas partes: um servidor e um cliente. Sempre que um cliente se conecta, ele começa a receber do servidor um número de sequência periódica. Uma nova sequência é iniciada para cada novo cliente, para que o servidor precise acompanhá-los individualmente. É aí que entra o jogo "Preciso enviar uma mensagem para um cliente em particular" . O código é muito simples de entender. Vamos ver isso.
Servidor
server.js
O servidor começa a escutar na porta 8000 as conexões de entrada. Quando alguém chega, ele adiciona esse novo cliente a um mapa para poder acompanhar seu número de sequência. Ele também escuta o
disconnect
evento desse cliente , quando o remove do mapa.A cada segundo, um timer é acionado. Quando isso acontece, o servidor percorre o mapa e envia uma mensagem para cada cliente com seu número de sequência atual. Em seguida, o incrementa e armazena o número de volta no mapa. É só isso. Mole-mole.
Cliente
A parte do cliente é ainda mais simples. Apenas se conecta ao servidor e escuta a
seq-num
mensagem, imprimindo-a no console toda vez que chega.client.js
Executando o exemplo
Instale as bibliotecas necessárias:
Execute o servidor:
Abra outras janelas de terminal e crie quantos clientes você desejar executando:
Também preparei uma essência com o código completo aqui .
fonte
Você pode usar
// envia mensagem apenas para o remetente-cliente
socket.emit('message', 'check this');
// ou você pode enviar para todos os ouvintes, incluindo o remetente
io.emit('message', 'check this');
// envia para todos os ouvintes, exceto o remetente
socket.broadcast.emit('message', 'this is a message');
// ou você pode enviá-lo para uma sala
socket.broadcast.to('chatroom').emit('message', 'this is the message to all');
fonte
Na 1.0 você deve usar:
fonte
io.sockets.connected["something"]
e seuemit
método.Qualquer que seja a versão que estamos usando, se apenas console.log () o objeto "io" que usamos no código nodejs do servidor, [por exemplo, io.on ('conexão', função (soquete) {...});] , podemos ver que "io" é apenas um objeto json e há muitos objetos filhos nos quais o ID do soquete e os objetos do soquete são armazenados.
Estou usando o socket.io versão 1.3.5, btw.
Se olharmos no objeto io, ele contém,
aqui podemos ver os socketids "B5AC9w0sYmOGWe4fAAAA" etc. Então, podemos fazer,
Novamente, em uma inspeção mais aprofundada, podemos ver segmentos como,
Então, podemos recuperar um soquete daqui fazendo
Além disso, sob o motor, temos,
Então, também podemos escrever,
Acho que podemos alcançar nosso objetivo de qualquer uma das três maneiras listadas acima,
fonte
Você consegue fazer isso
No servidor.
E no cliente, é muito fácil de manusear.
fonte
A partir da versão 1.4.5, certifique-se de fornecer um socketId com o prefixo correto em io.to (). Eu estava usando o socketId, o cliente logado para depurar e não tinha prefixo, então acabei pesquisando para sempre até descobrir! Portanto, talvez você precise fazer isso assim se o ID que você possui não tiver o prefixo:
fonte
io.sockets.sockets [socket.id] .emit (...) funcionou para mim na v0.9
fonte
Além disso, você pode manter as referências de clientes. Mas isso deixa sua memória ocupada.
Crie um objeto vazio e defina seus clientes nele.
em seguida, chame seu cliente específico por id do objeto
fonte
O Socket.IO permite "namespace" seus soquetes, o que significa essencialmente atribuir diferentes pontos de extremidade ou caminhos.
Isso pode ajudar: http://socket.io/docs/rooms-and-namespaces/
fonte