Websockets und SSE (Server Sent Events) können Daten an Browser senden, sind jedoch keine konkurrierenden Technologien.
Websockets-Verbindungen können sowohl Daten an den Browser senden als auch Daten vom Browser empfangen. Ein gutes Beispiel für eine Anwendung, die Websockets verwenden könnte, ist eine Chat-Anwendung.
SSE-Verbindungen können nur Daten an den Browser senden. Online-Börsenkurse oder Twitter, die die Zeitachse oder den Feed aktualisieren, sind gute Beispiele für eine Anwendung, die von SSE profitieren könnte.
In der Praxis erhält Websockets viel mehr Aufmerksamkeit und Liebe, da alles, was mit SSE getan werden kann, auch mit Websockets erledigt werden kann, und viel mehr Browser unterstützen Websockets als SSE.
Bei einigen Anwendungstypen kann dies jedoch zu viel des Guten sein, und das Backend kann mit einem Protokoll wie SSE einfacher implementiert werden.
Darüber hinaus kann SSE in älteren Browsern, die es nicht nativ unterstützen, mit nur JavaScript polygefüllt werden. Einige Implementierungen von SSE-Polyfills finden Sie auf der Modernizr-Github-Seite .
Fallstricke:
- SSE leidet unter einer Beschränkung auf die maximale Anzahl offener Verbindungen, was besonders beim Öffnen verschiedener Registerkarten schmerzhaft sein kann, da die Beschränkung pro Browser auf eine sehr niedrige Anzahl festgelegt ist (6). Das Problem wurde in Chrome und Firefox als "Wird nicht behoben" markiert . Dieses Limit gilt pro Browser + Domain. Das bedeutet, dass Sie 6 SSE-Verbindungen über alle Registerkarten zu
www.example1.com
und weitere 6 SSE-Verbindungen zu www.example2.com
(danke Phate) öffnen können.
- Nur WS kann sowohl Binärdaten als auch UTF-8 übertragen. SSE ist auf UTF-8 beschränkt. (Danke an Chado Nihi).
- Einige Unternehmensfirewalls mit Paketinspektion haben Probleme mit WebSockets (Sophos XG Firewall, WatchGuard, McAfee Web Gateway).
HTML5Rocks enthält einige gute Informationen zu SSE. Von dieser Seite:
Vom Server gesendete Ereignisse im Vergleich zu WebSockets
Warum sollten Sie vom Server gesendete Ereignisse WebSockets vorziehen? Gute Frage.
Ein Grund, warum SSEs im Schatten gehalten wurden, ist, dass spätere APIs wie WebSockets ein umfassenderes Protokoll für die bidirektionale Vollduplex-Kommunikation bereitstellen. Ein Zwei-Wege-Kanal ist attraktiver für Dinge wie Spiele, Messaging-Apps und für Fälle, in denen Sie nahezu Echtzeit-Updates in beide Richtungen benötigen. In einigen Szenarien müssen jedoch keine Daten vom Client gesendet werden. Sie benötigen lediglich Updates von einer Serveraktion. Einige Beispiele wären Statusaktualisierungen von Freunden, Börsenticker, Newsfeeds oder andere automatisierte Daten-Push-Mechanismen (z. B. Aktualisieren einer clientseitigen Web SQL-Datenbank oder eines IndexedDB-Objektspeichers). Wenn Sie Daten an einen Server senden müssen, ist XMLHttpRequest immer ein Freund.
SSEs werden über herkömmliches HTTP gesendet. Das bedeutet, dass sie kein spezielles Protokoll oder keine spezielle Serverimplementierung benötigen, um funktionieren zu können. WebSockets hingegen erfordern Vollduplex-Verbindungen und neue Web Socket-Server, um das Protokoll verarbeiten zu können. Darüber hinaus verfügen über vom Server gesendete Ereignisse über eine Reihe von Funktionen, die WebSockets aufgrund ihres Designs fehlen, z. B. die automatische Wiederverbindung, Ereignis-IDs und die Möglichkeit, beliebige Ereignisse zu senden.
TLDR-Zusammenfassung:
Vorteile von SSE gegenüber Websockets:
- Transport über einfaches HTTP anstelle eines benutzerdefinierten Protokolls
- Kann mit Javascript mehrfach gefüllt werden, um SSE in Browser "zurückportieren" zu können, die dies noch nicht unterstützen.
- Eingebaute Unterstützung für Wiederverbindung und Ereignis-ID
- Einfacheres Protokoll
- Keine Probleme mit Unternehmensfirewalls bei der Paketinspektion
Vorteile von Websockets gegenüber SSE:
- Echtzeit, bidirektionale Kommunikation.
- Native Unterstützung in mehr Browsern
Ideale Anwendungsfälle von SSE:
- Börsenticker-Streaming
- Aktualisierung des Twitter-Feeds
- Benachrichtigungen an den Browser
SSE Fallstricke:
- Keine binäre Unterstützung
- Maximales Limit für offene Verbindungen