Quelle est la différence entre io.sockets.emit et broadcast?

98

Quelle est la différence entre io.sockets.emit et socket.broadcast.emit? Est-ce seulement que la diffusion émet à tout le monde MAIS la socket qui l'envoie?

Il semble qu'ils peuvent être utilisés de manière interchangeable:

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
la source

Réponses:

175

io.sockets.emit enverra à tous les clients

socket.broadcast.emit enverra le message à tous les autres clients à l'exception de la connexion nouvellement créée

Cet article Wiki Socket.IO aidera tout le monde à lire cette question:

Jayantha Lal Sirisena
la source
22
Eh bien, cela a pris 3 heures de dépannage pour comprendre.
Petrogad du
Je peux vérifier que c'est bien le comportement, mais je ne vois aucune documentation pour socket.broadcast ni socket.broadcast.emit dans la documentation Github ni sur le site Web Socket.io . Est-ce que je manque quelque chose? (et le wiki est parti)
scipilot
1
Ce qui est encore "mieux" à ce sujet, c'est que l'exemple d'application "chat" fait un usage presque exclusif socket.broadcast.emitalors que cette API n'est jamais documentée nulle part.
Avi Cherry
@Sobiaholic Je n'ai toujours pas rencontré la raison évidente de ne pas émettre la modification de la connexion actuelle. Est-ce pour quand le client qui a déclenché l'événement avait déjà effectué une mise à jour optimiste à l'avance?
Nick Pineda
2
Ce n'est pas «sauf les connexions nouvellement créées», mais «vers tous les autres clients sauf lui-même». Vous pouvez avoir une connexion nouvellement créée (un client rejoignant la salle de discussion) et envoyer un message en utilisant socket.broadcast.emitet ils le recevront, mais pas vous.
NiCk Newman
47

socket.broadcast.emit()se comporte de la même manière que io.sockets.emit, mais au lieu d'émettre vers toutes les prises connectées, il émettra vers toutes les prises connectées sauf celle sur laquelle elle est appelée. Donc, dans ce cas, la socket référencée par socketne recevra pas l'événement.

Karthic Rao
la source
6
une mise à jour de plus - selon la réponse de Jayantha et ma propre analyse, elle n'émet pas non plus vers les connexions nouvellement créées, c'est-à-dire les nouvelles connexions client qui ont été créées après la création du «socket». C'est une différence importante et clé !!
Anmol Saraf
6
La "connexion nouvellement créée" à laquelle Jayantha se réfère est la socket dont l'événement de connexion est géré et qui émettrait la diffusion. Le point de diffusion est qu'il va à tous les clients à l'exception de la socket 'diffusion' - l'ordre dans lequel les connexions client ont été établies ne fait aucune différence.
Point
8

Scénario: 1: - Par l'utilisation de io.sockets.emit Diagramme détaillé: -io.sockets.emit

Ici, chaque socket reçoit le message, y compris l' initiateur .

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

Scénario: 2: - Par l'utilisation de socket.broadcast.emit Diagramme détaillé: -socket.broadcast.emit

Ici, toutes les prises reçoivent un message sauf un, c'est-à-dire un initiateur .

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

Conclusion: - Désormais, cela dépendra totalement de nos besoins commerciaux de celui qui sera préférable.

Anshu Ashish
la source