WebSockets vs. server-Sent events / EventSource

Zarówno WebSockets jak i zdarzenia wysłane przez Serwer są w stanie przesyłać dane do przeglądarek. Wydaje mi się, że to konkurencyjne technologie. Jaka jest między nimi różnica? Kiedy wybierzesz jedno nad drugim?

Author: Mads Mobæk, 2011-03-04

8 answers

Websockets i SSE (Server Sent Events) są w stanie przesyłać dane do przeglądarek, jednak nie są konkurencyjnymi technologiami.

Połączenia Websockets mogą zarówno wysyłać dane do przeglądarki, jak i odbierać dane z przeglądarki. Dobrym przykładem aplikacji, która mogłaby korzystać z websockets, jest aplikacja do czatu.

Połączenia SSE mogą przesyłać dane tylko do przeglądarki. Notowania giełdowe Online lub twittery aktualizujące oś czasu lub kanał są dobrymi przykładami aplikacji, która może skorzystaj z SSE.

W praktyce, ponieważ wszystko, co można zrobić z SSE, można również zrobić z Websockets, Websockets zyskuje o wiele więcej uwagi i miłości, a wiele więcej przeglądarek obsługuje Websockets niż SSE.

Jednak dla niektórych typów aplikacji może to być przesada, a backend może być łatwiejszy do zaimplementowania za pomocą protokołu takiego jak SSE.

Ponadto SSE może być polyfilowany w starszych przeglądarkach, które nie obsługują go natywnie przy użyciu tylko JavaScript. Niektóre implementacje SSE polyfills można znaleźć na stronie Modernizr github .

Gotchas:

  • SSE cierpi na ograniczenie do maksymalnej liczby otwartych połączeń, które może być szczególnie bolesne podczas otwierania różnych kart, ponieważ limit wynosi na przeglądarkę i jest ustawiony na bardzo niską liczbę (6). Problem został oznaczony jako "nie naprawi" w Chrome i Firefox
  • tylko WS może przesyłać zarówno dane binarne jak i UTF-8, SSE jest ograniczona do UTF-8. (Dzięki Chado Nihi).

HTML5Rocks ma kilka dobrych informacji na temat SSE. Z tej strony:

Zdarzenia wysyłane przez serwer vs. WebSockets

Dlaczego wybrałeś zdarzenia wysłane przez serwer zamiast WebSockets? Dobre pytanie.

Jednym z powodów, dla których SSE są trzymane w cieniu, jest to, że późniejsze interfejsy API, takie jak WebSockets, zapewniają bogatszy protokół do wykonywania dwukierunkowej komunikacji full-duplex. Posiadanie dwukierunkowego kanału jest bardziej atrakcyjne w przypadku gier, aplikacji do przesyłania wiadomości i przypadków, w których potrzebne są aktualizacje w czasie zbliżonym do rzeczywistego w obu kierunkach. Jednak w niektórych scenariuszach dane nie muszą być przesyłane od klienta. Po prostu potrzebujesz aktualizacji z niektórych działań serwerowych. Kilka przykładów to aktualizacje statusu znajomych, znaczniki akcji, kanały informacyjne lub inne zautomatyzowane mechanizmy push danych (np. aktualizowanie internetowej bazy danych SQL po stronie klienta lub magazynu obiektów IndexedDB). Jeśli musisz wysłać dane na serwer, XMLHttpRequest jest zawsze przyjaciel.

SSE są wysyłane przez tradycyjny HTTP. Oznacza to, że nie wymagają specjalnego protokołu lub implementacji serwera, aby zacząć działać. WebSockets z drugiej strony wymagają połączeń full-duplex i nowych serwerów Web Socket do obsługi protokołu. Ponadto zdarzenia wysyłane przez serwer mają wiele funkcji, których WebSockets nie mają z założenia, takich jak automatyczne ponowne połączenie, identyfikatory zdarzeń i możliwość wysyłania dowolnych zdarzeń.


TLDR podsumowanie:

Zalety SSE nad Websockets:

  • transportowane przez prosty HTTP zamiast niestandardowego protokołu
  • może być poly-filled with javascript to "backport" SSE do przeglądarek, które jeszcze go nie obsługują.
  • Dzięki temu można w prosty sposób połączyć się z Internetem.]}
  • prostszy protokół

Zalety Websockets nad SSE:

  • w czasie rzeczywistym, dwukierunkowa komunikacja.
  • natywne wsparcie w więcej przeglądarek

Idealne przypadki użycia SSE:

  • Stock ticker streaming
  • Aktualizacja kanału twitter
  • powiadomienia do przeglądarki

SSE gotchas:

  • brak wsparcia binarnego
  • maksymalny limit otwartych połączeń
 730
Author: Alex Recarey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-19 21:43:04

Według caniuse.com:

Możesz użyć tylko klienta polyfill rozszerzyć obsługę SSE na wiele innych przeglądarek. Jest to mniej prawdopodobne w przypadku WebSockets. Niektóre EventSource polyfills:

Jeśli chcesz obsługiwać wszystkie przeglądarki, rozważ użycie biblioteki takiej jak web-socket-js, SignalR lub socket.io które obsługują wiele transportów, takich jak WebSockets, SSE, Forever Frame i AJAX long polling. Często wymagają one również modyfikacji po stronie serwera.

Dowiedz się więcej o SSE from:

Dowiedz się więcej o WebSockets z:

Inne różnice:

  • WebSockets obsługuje dowolne dane binarne, SSE używa tylko UTF-8
 89
Author: Drew Noakes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:31

Opera, Chrome, Safari obsługuje SSE, Chrome, Safari obsługuje SSE wewnątrz SharedWorker Firefox obsługuje XMLHttpRequest readyState interactive, dzięki czemu możemy uczynić EventSource polyfil dla Firefoksa

 14
Author: Yaffle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-11 18:49:46

Websocket VS SSE


Web Sockets- jest to protokół, który zapewnia kanał komunikacji full-duplex poprzez jedno połączenie TCP. Na przykład dwukierunkowa komunikacja między serwerem a przeglądarką Ponieważ protokół jest bardziej skomplikowany, serwer i przeglądarka muszą polegać na bibliotece websocket czyli socket.io

Example - Online chat application.

SSE (Server-Sent Event) - W przypadku zdarzenia wysłanego do serwera komunikacja jest realizowana z serwera do tylko przeglądarka i przeglądarka nie może wysyłać żadnych danych na serwer. Ten rodzaj komunikacji jest używany głównie gdy trzeba tylko pokazać zaktualizowane dane, wtedy serwer wysyła wiadomość za każdym razem, gdy dane zostaną zaktualizowane. Na przykład jednokierunkowa komunikacja między serwerem a przeglądarką. Protokół ten jest mniej skomplikowany, więc nie trzeba polegać na zewnętrznej bibliotece JAVASCRIPT sam dostarcza interfejs EventSource do odbierania wiadomości wysyłanych przez serwer.

Example - Online stock quotes or cricket score website.
 4
Author: Gaurav Tiwari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-01 17:58:25

Jedna rzecz do zapamiętania:
Miałem problemy z websocketami i korporacyjnymi firewallami. (Korzystanie z HTTPS pomaga, ale nie zawsze.)

Zobacz https://github.com/LearnBoost/socket.io/wiki/Socket.IO-and-firewall-software https://github.com/sockjs/sockjs-client/issues/94

I zakładam, że nie ma tak wielu problemów z wysyłanymi przez serwer zdarzeniami. Ale nie wiem.

To powiedziawszy, WebSockets są mnóstwo zabawy. Mam małą grę internetową, która używa websockets (poprzez Socket.IO) ( http://minibman.com )

 3
Author: Drew LeSueur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-19 03:04:05

Tutaj {[2] } jest dyskusja na temat różnic między gniazdami sieciowymi a zdarzeniami wysyłanymi przez serwer. Ponieważ Java EE 7 a WebSocket API jest już częścią specyfikacji i wydaje się, że zdarzenia wysłane przez serwer zostaną wydane w następnej wersji enterprise edition.

 0
Author: Patrick Leitermann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-12 07:17:14

WebSocket i SSE {[2] } są alternatywami dla tradycyjnej architektury sieci Web typu request-response, ale nie są to technologie konkurencyjne. Architektura WebSocket składa się z gniazda, które jest otwierane między Klientem a serwerem w celu komunikacji full-duplex (dwukierunkowej). Zamiast wysyłać wiadomość GET i czekać na odpowiedź serwera, klient po prostu nasłuchuje gniazda, odbierając aktualizacje serwera i używając danych do inicjowania lub obsługi różnych interakcje. Klient może również użyć gniazda do komunikacji z serwerem, na przykład wysyłając wiadomość ACK, gdy aktualizacja została pomyślnie odebrana.

SSE jest prostszym standardem, opracowanym jako rozszerzenie HTML5. Podczas gdy SSE włącza asynchroniczne wiadomości z serwera do Klienta, Klient nie może wysyłać wiadomości do serwera. Model komunikacji half-duplex firmy SSE najlepiej nadaje się do aplikacji, w których Klient musi po prostu otrzymywać strumieniowe aktualizacje z serwer. Jedną z zalet SSE nad WebSocket jest to, że działa ON przez HTTP, bez konieczności stosowania dodatkowych komponentów.

Dla wielozadaniowej aplikacji webowej wymagającej szerokiej komunikacji między Klientem a serwerem, WebSocket jest oczywistym wyborem. SSE jest bardziej odpowiedni dla aplikacji, które chcą przesyłać dane asynchroniczne do klienta z serwera, ale nie wymagają odpowiedzi z powrotem.

Źródło

 0
Author: Srikrushna Pal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-29 21:11:05

Maksymalny limit połączenia nie jest problemem z http2 + sse.

To był problem na http 1

 -4
Author: user1948585,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-22 20:26:57