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
});

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:


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.