Zarówno WebSockets, jak i zdarzenia wysyłane przez serwer są w stanie przesyłać dane do przeglądarek. Wydaje mi się, że są to konkurujące technologie. Jaka jest różnica między nimi? Kiedy wybierzesz jedną z drugiej?
html
browser
websocket
server-sent-events
Mads Mobæk
źródło
źródło
curl
. Ponieważ jest to tylko format tekstowy przez HTTP, łatwo jest zobaczyć, co się dzieje.Odpowiedzi:
Zarówno Websockets, jak i SSE (Server Sent Events) są w stanie przesyłać dane do przeglądarek, jednak nie są to konkurencyjne technologie.
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ą przekazywać dane tylko do przeglądarki. Notowania giełdowe online lub Twitter aktualizujący oś czasu lub kanał to dobre przykłady aplikacji, która mogłaby skorzystać z SSE.
W praktyce, ponieważ wszystko, co można zrobić za pomocą SSE, można również zrobić za pomocą Websockets, Websockets zyskuje o wiele więcej uwagi i miłości, a wiele innych przeglądarek obsługuje Websockets niż SSE.
Jednak w przypadku niektórych typów aplikacji może to być nadmiar, a backend może być łatwiejszy do wdrożenia przy pomocy protokołu takiego jak SSE.
Ponadto SSE może być wypełniane w starszych przeglądarkach, które nie obsługują go natywnie za pomocą samego JavaScript. Niektóre implementacje wypełnień SSE można znaleźć na stronie github Modernizr .
Gotchas:
www.example1.com
i kolejne 6 połączeń SSE dowww.example2.com
(dzięki Phate).HTML5Rocks ma kilka dobrych informacji na temat SSE. Z tej strony:
Podsumowanie TLDR:
Zalety SSE nad Websockets:
Zalety Websockets nad SSE:
Idealne przypadki użycia SSE:
Gotówki SSE:
źródło
Według caniuse.com:
Możesz użyć polifill tylko dla klienta, aby rozszerzyć obsługę SSE na wiele innych przeglądarek. Jest to mniej prawdopodobne w przypadku WebSockets. Niektóre wypełniacze EventSource:
Jeśli potrzebujesz obsługiwać wszystkie przeglądarki, rozważ użycie biblioteki takiej jak web-socket-js , SignalR lub socket.io, która obsługuje wiele transportów, takich jak WebSockets, SSE, Forever Frame i długie odpytywanie AJAX. Często wymagają one również modyfikacji po stronie serwera.
Dowiedz się więcej o SSE od:
Dowiedz się więcej o WebSockets od:
Inne różnice:
źródło
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 Firefox
źródło
Websocket VS SSE
Gniazda sieciowe - jest to protokół, który zapewnia pełny dupleksowy kanał komunikacyjny za pośrednictwem jednego połączenia 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, która jest
socket.io
SSE (Zdarzenie wysłane przez serwer ) - W przypadku zdarzenia wysłanego przez serwer komunikacja odbywa się tylko z serwera do przeglądarki, a przeglądarka nie może wysłać żadnych danych do serwera. Ten rodzaj komunikacji jest używany głównie wtedy, gdy konieczne jest jedynie pokazanie zaktualizowanych danych, a następnie serwer wysyła komunikat za każdym razem, gdy dane są aktualizowane. Na przykład jednokierunkowa komunikacja między serwerem a przeglądarką. Ten protokół jest mniej skomplikowany, więc nie trzeba polegać na zewnętrznej bibliotece, która sama JAVASCRIPT zapewnia
EventSource
interfejs do odbierania wysyłanych przez serwer wiadomości.źródło
Należy zwrócić uwagę na jedną rzecz:
miałem problemy z gniazdami sieciowymi i zaporami korporacyjnymi. (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ładamy, że nie ma tyle problemów z serwera Sent Events. Ale nie wiem.
To powiedziawszy, WebSockets to mnóstwo zabawy. Mam małą grę internetową, która korzysta z websockets (przez Socket.IO) ( http://minibman.com )
źródło
Oto omówienie różnic między gniazdami sieciowymi a zdarzeniami wysyłanymi przez serwer. Od wersji Java EE 7 interfejs API WebSocket jest już częścią specyfikacji i wygląda na to, że zdarzenia wysyłane przez serwer zostaną wydane w następnej wersji wersji Enterprise.
źródło
Maksymalny limit połączeń nie stanowi problemu w przypadku http2 + sse.
To był problem na http 1
źródło