Enviando mensagem para um ID específico em Socket.IO 1.0

85

Quero enviar dados para um ID de soquete específico.

Costumávamos fazer isso nas versões mais antigas:

io.sockets.socket(socketid).emit('message', 'for your eyes only');

Como eu faria algo semelhante no Socket.IO 1.0?


fonte

Respostas:

206

No socket.io 1.0 eles fornecem uma maneira melhor para isso. Cada soquete automaticamente se junta a uma sala padrão por auto-identificação. Verifique os documentos: http://socket.io/docs/rooms-and-namespaces/#default-room

Portanto, você pode emitir para um soquete por id com o seguinte código:

io.to(socketid).emit('message', 'for your eyes only');
Mustafa Dokumacı
fonte
Há diferença entre to (room_id) e (user_socket_id)? Na verdade, eu o uso para enviar mensagem para uma sala que pode ter um ou mais usuários. "Isso torna mais fácil transmitir mensagens para outros soquetes:", então pode ser um ou mais, não um único privado.
Washington Botelho,
@WashingtonBotelho, os IDs de soquete normalmente se parecem com "Uj5CRqZ5b_Xubx9sAAAA", então em teoria pode haver mais de um usuário nessa sala, mas na prática não conheço nenhum caso em que adicionaria um usuário à sala pessoal de outro usuário.
Oleg,
9
Como podemos identificar um usuário específico por seu socketId, isso significa que precisamos armazenar um par de valores-chave de usuário (por exemplo, nome de usuário) e socketId em algum lugar?
Sai de
@Mustafa Dokumacı merhaba, bana bir yardim et stackoverflow.com/questions/38817680/…
mahdi pishguy
É tão pouco lógico ... por que não nos fornece uma maneira de enviar uma mensagem para um número de identificação de soquete e é isso? De qualquer forma, a única solução alternativa que realmente funciona em 2.x
Adry
94

No socket.io 1.0, você pode fazer isso com o seguinte código:

if (io.sockets.connected[socketid]) {
    io.sockets.connected[socketid].emit('message', 'for your eyes only');
}

Atualizar:

A resposta de @MustafaDokumacı contém uma solução melhor.

Oleg
fonte
3
A diferença entre esta resposta e a melhor resposta apontada é que com ESTA solução, você pode ter callbacks o que é bom. Mas com io.to (socketid), você NÃO PODE usar callbacks.
Ramazan Polat
17

@Mustafa Dokumacı e @Curious já forneceram informações suficientes, estou adicionando como você pode obter a id do soquete.

Para obter o id do soquete, use socket.id :

var chat = io.of("/socket").on('connection',onSocketConnected);

function onSocketConnected(socket){
   console.log("connected :"+socket.id);  
}
Dhiral Pandya
fonte
6

Se você usou um namespace, descobri que o seguinte funciona:

//Defining the namespace <br>
var nsp = io.of('/my-namespace');

//targeting the message to socket id <br>
nsp.to(socket id of the intended recipient).emit('private message', 'hello');

Mais sobre namespaces: http://socket.io/docs/rooms-and-namespaces/

Meth
fonte
5

Acredito que @Curious e @ MustafaDokumacı forneceram soluções que funcionam bem. A diferença é que, com a solução de @MustafaDokumacı, a mensagem é transmitida para uma sala e não apenas para um cliente específico.

A diferença é evidente quando um reconhecimento é solicitado.

io.sockets.connected[socketid].emit('message', 'for your eyes only', function(data) {...});

funciona como esperado, enquanto

io.to(socketid).emit('message', 'for your eyes only', function(data) {...});

falha com

Error: Callbacks are not supported when broadcasting
Giannis Kosmas
fonte
1

no Node.js -> socket.io -> existe um exemplo de chat para baixar a parte Cole isso na linha (io na conexão) .. eu uso esse código que funciona 100%

io.on('connection', function(socket){
  socket.on('chat message', function(msg){
    console.log(socket.id);
    io.to(socket.id).emit('chat message', msg+' you ID is:'+socket.id);
  });
});
user2204339
fonte