Jaka jest różnica między io.sockets.emit a broadcast?

98

Jaka jest różnica między io.sockets.emit i socket.broadcast.emit? Czy to tylko ta transmisja jest wysyłana do wszystkich ALE gniazdo, które ją wysyła?

Wygląda na to, że można ich używać zamiennie:

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
źródło

Odpowiedzi:

175

io.sockets.emit wyśle ​​do wszystkich klientów

socket.broadcast.emit wyśle ​​wiadomość do wszystkich innych klientów z wyjątkiem nowo utworzonego połączenia

Ten post na Wiki Socket.IO pomoże wszystkim czytającym to pytanie:

Jayantha Lal Sirisena
źródło
22
cóż, rozwiązanie problemu zajęło 3 godziny.
Petrogad,
Mogę zweryfikować, że rzeczywiście tak jest, ale nie widzę żadnej dokumentacji dotyczącej socket.broadcast ani socket.broadcast.emit w dokumentach Github ani w witrynie Socket.io . Czy coś mi brakuje? (a wiki zniknęło)
scipilot
1
Jeszcze „lepsze” w tym jest to, że przykładowa aplikacja „czatowa” prawie wyłącznie wykorzystuje, socket.broadcast.emitpodczas gdy API nigdy nie jest nigdzie dokumentowane.
Avi Cherry
@Sobiaholic Nadal nie spotkałem się z oczywistym powodem nie emitowania zmiany w bieżącym połączeniu. Czy dzieje się tak, gdy klient, który wywołał zdarzenie, dokonał już wcześniej optymistycznej aktualizacji?
Nick Pineda
2
Nie jest to „z wyjątkiem nowo utworzonych połączeń”, powinno być „dla wszystkich innych klientów oprócz siebie samego”. Możesz mieć nowo utworzone połączenie (klient dołączający do pokoju rozmów) i wyślij wiadomość za pomocą, socket.broadcast.emita oni ją otrzymają, ale nie Ty.
NiCk Newman
47

socket.broadcast.emit()zachowuje się podobnie do io.sockets.emit, ale zamiast emitować do wszystkich podłączonych gniazd, będzie emitować do wszystkich podłączonych gniazd z wyjątkiem tego, do którego jest wywoływane. Więc w tym przypadku gniazdo, do którego odwołuje się odwołanie socket, nie otrzyma zdarzenia.

Karthic Rao
źródło
6
jeszcze jedna aktualizacja - zgodnie z odpowiedzią Jayanthy i moją własną analizą, NIE WYSYŁA ona również do nowo utworzonych połączeń, tj. nowych połączeń klientów, które zostały utworzone po utworzeniu „gniazda”. To jest ważna i kluczowa różnica !!
Anmol Saraf,
6
„Nowo utworzone połączenie”, do którego odwołuje się Jayantha, to gniazdo, którego zdarzenie połączenia jest obsługiwane i które wyemituje transmisję. Rozgłaszanie polega na tym, że trafia do każdego klienta z wyjątkiem gniazda „broadcasting” - kolejność nawiązywania połączeń klienta nie ma znaczenia.
Średnik
8

Scenariusz: 1: - Dzięki zastosowaniu io.sockets.emit szczegółowy schemat: -io.sockets.emit

Tutaj każde gniazdo otrzymuje wiadomość, w tym inicjator .

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

Scenariusz: 2: - Przy użyciu socket.broadcast.emit Szczegółowy diagram: -socket.broadcast.emit

Tutaj wszystkie gniazda otrzymują komunikat oprócz jednego, tj . Inicjatora .

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

Wniosek: - Teraz będzie to całkowicie zależało od naszych wymagań biznesowych, który z nich będzie lepszy.

Anshu Ashish
źródło