Envío de mensaje a un ID específico en Socket.IO 1.0

85

Quiero enviar datos a un ID de socket específico.

Solíamos poder hacer esto en las versiones anteriores:

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

¿Cómo haría yo para hacer algo similar en Socket.IO 1.0?


fuente

Respuestas:

206

En socket.io 1.0 proporcionan una mejor forma de hacerlo. Cada zócalo se une automáticamente a una habitación predeterminada por su propia identificación. Consultar documentos: http://socket.io/docs/rooms-and-namespaces/#default-room

Entonces puede emitir a un socket por id con el siguiente código:

io.to(socketid).emit('message', 'for your eyes only');
Mustafa Dokumacı
fuente
¿Hay diferencia entre to (room_id) y (user_socket_id)? De hecho, lo uso para enviar mensajes a una sala que puede tener uno o más usuarios. "Esto facilita la transmisión de mensajes a otros sockets:", entonces puede ser uno o más, no uno privado único.
Washington Botelho
@WashingtonBotelho, los ID de socket generalmente se parecen a "Uj5CRqZ5b_Xubx9sAAAA", por lo que en teoría podría haber más de un usuario en esa sala, pero en la práctica no conozco ningún caso en el que agregaría un usuario a la sala personal de otro usuario.
Oleg
9
¿Cómo podemos identificar a un usuario específico por su socketId? ¿Significa esto que necesitamos almacenar un par de valores clave de usuario (por ejemplo, nombre de usuario) y socketId en algún lugar?
Sai
@Mustafa Dokumacı merhaba, bana bir yardim et stackoverflow.com/questions/38817680/…
mahdi pishguy
Es tan poco lógico ... ¿por qué no nos proporciona una forma de enviar un mensaje a un número de identificación de socket y eso es todo? De todos modos upvoted, el único trabajo en torno a que realmente funciona en 2.x
Adry
94

En socket.io 1.0 puedes hacerlo con el siguiente código:

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

Actualizar:

La respuesta de @ MustafaDokumacı contiene una mejor solución.

Oleg
fuente
3
La diferencia entre esta respuesta y la mejor respuesta es que con ESTA solución, puede tener devoluciones de llamada, lo cual es bueno. Pero con io.to (socketid), NO PUEDES usar devoluciones de llamada.
Ramazan Polat
17

@Mustafa Dokumacı y @Curious ya proporcionaron suficiente información, estoy agregando cómo puede obtener la identificación del socket.

Para obtener la identificación del socket, use socket.id :

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

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

Si ha utilizado un espacio de nombres, descubrí que lo siguiente 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');

Más sobre espacios de nombres: http://socket.io/docs/rooms-and-namespaces/

Metanfetamina
fuente
5

Creo que tanto @Curious como @ MustafaDokumacı proporcionaron soluciones que funcionan bien. Sin embargo, la diferencia es que con la solución de @ MustafaDokumacı, el mensaje se transmite a una sala y no solo a un cliente en particular.

La diferencia es notable cuando se solicita un reconocimiento.

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

funciona como se esperaba, mientras

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

falla con

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

en Node.js -> socket.io -> hay un ejemplo de chat para descargar Pegue esto en la parte de línea (io en la conexión) ... uso este código que funciona al 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
fuente