Was ist der Unterschied zwischen io.sockets.emit und Broadcast?

98

Was ist der Unterschied zwischen io.sockets.emit und socket.broadcast.emit? Wird nur die Sendung an alle gesendet, ABER an den Socket, der sie sendet?

Es scheint, dass sie austauschbar verwendet werden können:

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
quelle

Antworten:

174

io.sockets.emit wird an alle Kunden senden

socket.broadcast.emit sendet die Nachricht an alle anderen Clients mit Ausnahme der neu erstellten Verbindung

Dieser Socket.IO-Wiki-Beitrag hilft allen, die diese Frage lesen:

Jayantha Lal Sirisena
quelle
22
Nun, das hat 3 Stunden gedauert, um das herauszufinden.
Petrogad
Ich kann überprüfen, ob dies tatsächlich das Verhalten ist, aber ich kann keine Dokumentation für socket.broadcast oder socket.broadcast.emit in den Github-Dokumenten oder auf der Socket.io-Website sehen . Vermisse ich etwas (und das Wiki ist weg)
Scipilot
1
Was noch "besser" daran ist, ist, dass die Beispielanwendung "Chat" fast ausschließlich verwendet wird, socket.broadcast.emitwährend diese API nirgendwo dokumentiert wird.
Avi Cherry
@Sobiaholic Ich habe immer noch nicht den offensichtlichen Grund gefunden, warum die Änderung an der aktuellen Verbindung nicht vorgenommen wurde. Ist es für den Fall, dass der Client, der das Ereignis ausgelöst hat, bereits im Voraus ein optimistisches Update durchgeführt hat?
Nick Pineda
2
Es ist nicht "außer den neu erstellten Verbindungen", es sollte "zu allen anderen Clients außer sich selbst" sein. Sie können eine neu erstellte Verbindung haben (ein Client, der dem Chatraum beitritt) und Sie senden eine Nachricht mit socket.broadcast.emitund sie erhalten sie, aber nicht Sie.
NiCk Newman
47

socket.broadcast.emit()verhält sich ähnlich wie io.sockets.emit, sendet jedoch nicht an alle angeschlossenen Sockets, sondern an alle angeschlossenen Sockets mit Ausnahme des Sockets, auf dem es aufgerufen wird. In diesem Fall socketerhält der Socket, auf den verwiesen wird, das Ereignis nicht.

Karthic Rao
quelle
6
Noch ein Update - gemäß Jayanthas Antwort und meiner eigenen Analyse wird es auch NICHT an neu erstellte Verbindungen gesendet, dh an die neuen Clientverbindungen, die nach dem Erstellen des 'Sockets' erstellt wurden. Dies ist ein wichtiger und entscheidender Unterschied !!
Anmol Saraf
6
Die "neu erstellte Verbindung", auf die sich Jayantha bezieht, ist der Socket, dessen Verbindungsereignis behandelt wird und der die Sendung ausgeben würde. Der Punkt der Übertragung ist, dass sie an jeden Client mit Ausnahme des "Broadcasting" -Sockets gesendet wird - die Reihenfolge, in der die Clientverbindungen hergestellt wurden, spielt keine Rolle.
Semikolon
8

Szenario: 1: - Mit io.sockets.emit Detailliertes Diagramm: -io.sockets.emit

Hier erhält jeder Socket die Nachricht einschließlich Initiator .

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

Szenario: 2: - Bei Verwendung von socket.broadcast.emit Detailliertes Diagramm: -socket.broadcast.emit

Hier erhalten alle Sockets eine Nachricht außer einem, dh einem Initiator .

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

Fazit: - Jetzt hängt es ganz von unserer Geschäftsanforderung ab, welche vorzuziehen ist.

Anshu Ashish
quelle