¿Cuál es la diferencia entre io.sockets.emit y broadcast?

98

¿Cuál es la diferencia entre io.sockets.emit y socket.broadcast.emit? ¿Es solo que la transmisión emite a todos, PERO al socket que la envía?

Parece que se pueden usar indistintamente:

io.sockets.on('connection', function (socket) {
  //these should do the same thing  
  io.sockets.emit('this', { receivers: 'everyone'});

  socket.broadcast.emit('this', { receivers: 'everyone but socket'}); //emits to everyone but socket
  socket.emit('this', { receivers: 'socket'}); //emits to socket
});
swiecki
fuente

Respuestas:

174

io.sockets.emit enviará a todos los clientes

socket.broadcast.emit enviará el mensaje a todos los demás clientes excepto a la conexión recién creada

Esta publicación Wiki de Socket.IO ayudará a todos los que lean esta pregunta:

Jayantha Lal Sirisena
fuente
22
Bueno, eso tomó 3 horas de resolución de problemas para resolverlo.
Petrogad
Puedo verificar que este es realmente el comportamiento, pero no puedo ver ninguna documentación para socket.broadcast ni socket.broadcast.emit en los documentos de Github ni en el sitio web de Socket.io . ¿Me estoy perdiendo de algo? (y la wiki se ha ido)
scipilot
1
Lo que es incluso "mejor" acerca de esto es que la aplicación de "chat" de ejemplo hace un uso casi exclusivo, socket.broadcast.emitmientras que esa API nunca está documentada en ninguna parte.
Avi Cherry
@Sobiaholic Todavía no he encontrado la razón obvia para no emitir el cambio en la conexión actual. ¿Es para cuando el cliente que desencadenó el evento ya había realizado una actualización optimista de antemano?
Nick Pineda
2
No es "excepto las conexiones recién creadas", debería ser "para todos los demás clientes excepto para él mismo". Puede tener una conexión recién creada (un cliente que se une a la sala de chat) y envía un mensaje usando socket.broadcast.emity ellos lo recibirán, pero usted no.
NiCk Newman
47

socket.broadcast.emit()se comporta de manera similar io.sockets.emit, pero en lugar de emitir a todos los sockets conectados, emitirá a todos los sockets conectados excepto al que se está llamando. Entonces, en este caso, el socket al que se hace referencia socketno recibirá el evento.

Karthic Rao
fuente
6
una actualización más: según la respuesta de Jayantha y mi propio análisis, tampoco emite a las conexiones recién creadas, es decir, las nuevas conexiones de cliente que se crearon después de que se creó el 'socket'. ¡Esta es una diferencia importante y clave!
Anmol Saraf
6
La "conexión recién creada" a la que se refiere Jayantha es el socket cuyo evento de conexión se está manejando y quién emitiría la transmisión. El punto de la transmisión es que va a todos los clientes excepto al conector de 'transmisión': el orden en que se establecieron las conexiones del cliente no importa.
Punto
8

Escenario: 1: - Mediante el uso de io.sockets.emit Diagrama detallado: -io.sockets.emit

Aquí, cada conector recibe el mensaje, incluido el iniciador .

  // BY IO>SOCKETS>EMIT
   io.sockets.emit('MyChannelBroadcast',
               {
                 owner:"Anshu Ashish",
                 clientCount:clients,
                 message:"Welcome All"
               }
    );

Escenario: 2: - Mediante el uso de socket.broadcast.emit Diagrama detallado: -socket.broadcast.emit

Aquí, todos los sockets reciben un mensaje excepto uno, es decir, el iniciador .

    // BY SOCKET>BROADCAST>EMIT
   socket.broadcast.emit('BroadCastExceptMe',{data:"HAVE A NICE DAY"});

Conclusión: - Ahora dependerá totalmente de nuestro requerimiento comercial cuál será preferible.

Anshu Ashish
fuente