2012-04-26 36 views
78

¿Cuál es la diferencia entre io.sockets.emit y socket.broadcast.emit? ¿Es solo que la emisión emite a todos pero el zócalo que lo envía?¿Cuál es la diferencia entre io.sockets.emit y broadcast?

Parece que se pueden utilizar 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 
}); 

Respuesta

137

io.sockets.emit enviará a todos los clientes

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

This Socket.IO Wiki post will help everyone reading this question:

+16

bien que tomó 3 horas de problemas para resolverlo. – Petrogad

+0

Puedo verificar que este es de hecho 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] (http://socket.io/docs/ client-api /). ¿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 ejemplo "chat" hace un uso casi exclusivo de 'socket.broadcast.emit' mientras esa API nunca se documenta en ninguna parte. –

37

socket.broadcast.emit() se comporta como io.sockets.emit, pero en su lugar de emisión a todos los enchufes conectados, se emitirá a todos los conectores conectados, excepto el que está siendo llamado. Por lo tanto, en este caso, el socket al que hace referencia el socket no recibirá el evento.

+4

una actualización más - según la respuesta de Jayantha y mi propio análisis, tampoco se emite a las conexiones recién creadas, es decir, a las nuevas conexiones de clientes que se crearon después de que se creó el 'socket'. ¡Esta es una diferencia importante y clave! –

+4

La "nueva conexión creada" a la que se refiere Jayantha es el socket cuyo evento de conexión se está manejando y quién emitirá la transmisión.El punto de la transmisión es que va a cada cliente, excepto el socket de "difusión": el orden en que se establecieron las conexiones del cliente no cambia nada. – Semicolon

+0

Esta debería ser la respuesta de aceptación. –

1

Escenario: 1: - Mediante el uso de io.sockets.emit Detailed Diagram:-io.sockets.emit

aquí cada socket recibe el mensaje que incluye 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 Detailed Diagram:-socket.broadcast.emit

aquí todos los sockets son cada mensaje, excepto uno, es decir Iniciador.

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

Conclusión: - Ahora se depende totalmente nuestra requisito de negocio que cuál será preferible.

Cuestiones relacionadas