Wenn der Server Neuigkeiten hat
Eine Verbindung, beide Richtungen
Long Polling lässt den Server antworten, sobald eine Neuigkeit eintrifft, aber jede Antwort beendet eine Anfrage. Server-Sent Events lassen den Server weiterschreiben, aber nur den Server. Die Anzeigetafel braucht beides zugleich: Zuschauer, die jede Änderung in dem Moment hören, in dem sie passiert, und einen Punktezähler, der Punktestände sendet, wann immer eine Frage bewertet ist. Ein
Vier Dinge, die ein WebSocket bietet
Eine Verbindung, die offen bleibt. Ein Zuschauer verbindet sich einmal, zu Beginn des Abends, und behält dieselbe
, bis das Quiz endet. Für die nächste Neuigkeit ist keine neue Anfrage nötig. Beide Seiten dürfen jederzeit senden. Das nennt man Vollduplex (full duplex). Der Server sendet eine Änderung des Punktestands in dem Moment, in dem sie passiert, ohne gefragt zu werden, und ein Client sendet, wann immer er etwas zu sagen hat, ohne auf den Server zu warten. Keine der beiden Nachrichten ist eine Antwort auf die andere.
Daten kommen als ganze Nachrichten an. Aus Networks with Python weißt du, dass TCP ein Byte-Stream ohne Grenzen ist: Zwei nacheinander gesendete Nachrichten können zusammengeklebt oder in Stücke geschnitten ankommen. Deshalb verpackt ein WebSocket jede Nachricht in einen
, ähnlich wie dein Protokoll mit Längenpräfix in jenem Kurs eine Länge vor jede Nachricht gesetzt hat. Der Leser bekommt Owls 12als eine Nachricht, nieOwund dannls 12. Kapitel 3 nimmt diese Frames Byte für Byte auseinander.Er beginnt als
-Anfrage. Der Client öffnet eine Verbindung zu denselben wie HTTP und sendet zuerst eine gewöhnliche HTTP-Anfrage, sodass alles, was HTTP bereits verarbeitet, vertraute erste Bytes sieht. Diese Anfrage bittet den Server, die Verbindung auf das WebSocket-Protokoll umzustellen, und wenn der Server zustimmt, trägt dieselbe Verbindung von da an WebSocket-Nachrichten. Diese Umstellung heißt .
Die Punkte 1 und 2 sind das, was Long Polling und Server-Sent Events dir nicht zusammen geben konnten. Punkt 3 macht eine langlebige Verbindung für Nachrichten brauchbar, und Punkt 4 ist die Art, wie sie startet, ohne dass zwischen Client und Server etwas Neues nötig ist.
Was eine Nachricht kostet
Sobald die Verbindung offen ist, trägt eine Nachricht kaum mehr als ihre eigenen Bytes. Der Frame-Anteil vor einer Nachricht, die der Server sendet und die bis zu 125 Bytes lang ist, beträgt 2 Bytes. Eine Nachricht von einem Client an einen Server trägt 6, weil Clients einen 4 Byte langen
Vergleiche das mit einer leeren Abfrage aus Lektion 2: eine Anfragezeile, ein Host-Header und ein If-None-Match-Header auf dem Hinweg und eine Statuszeile und ein ETag-Header auf dem Rückweg, nur um zu erfahren, dass sich nichts geändert hat. Allein die Anfragezeile GET /scores HTTP/1.1 hat vor ihrem Zeilenende 20 Bytes, und der Frame-Header einer kurzen Nachricht hat 2. Auf einem WebSocket muss niemand fragen, also sendet eine Minute ohne Neuigkeiten überhaupt keine Anfragen.
Ein Server sendet Owls 12 (7 Bytes) über einen WebSocket an einen Zuschauer. Wie viele Bytes Frame-Anteil gehören dazu?
Vier Techniken nebeneinander
Im Bild bekommt jede Technik zwei Zeitlinien, den Client oben und den Server unten, und die Zeit läuft nach rechts; eine Raute ist eine Änderung des Punktestands. Folge jeder Raute zu dem Pfeil, der sie zum Client bringt.

Die Tabelle sagt dasselbe in Spalten:
| Technik | Wer jeden Austausch beginnt | Richtung | Verspätung | Kosten pro Nachricht |
|---|---|---|---|---|
| Polling | der Client, nach Zeitplan | der Client fragt, der Server antwortet | ungefähr das halbe Intervall | eine vollständige Anfrage und Antwort, plus viele leere |
| Long Polling | der Client | der Client fragt, der Server antwortet, wenn es Neuigkeiten gibt | ungefähr ein Weg durch das Netzwerk | eine vollständige Anfrage und Antwort |
| Server-Sent Events | der Client, einmal; dann der Server | nur vom Server zum Client | ungefähr ein Weg durch das Netzwerk | ein paar Bytes in der offenen Antwort |
| WebSocket | der Client, einmal; dann beide Seiten | in beide Richtungen auf einer Verbindung | ungefähr ein Weg durch das Netzwerk | ein paar Bytes Frame-Anteil |
Die Tabelle lässt den WebSocket jedes Mal wie den Sieger aussehen, und das ist er nicht. Polling ist die einfachste der vier Techniken, und wenn Neuigkeiten selten sind, kosten ein paar Anfragen pro Stunde fast nichts. Server-Sent Events passen gut, wenn nur der Server Neuigkeiten hat. Ein WebSocket lohnt seinen zusätzlichen Aufwand, wenn beide Seiten oft reden.
Zuschauer brauchen jede Änderung des Punktestands sofort, und der Punktezähler sendet Änderungen aus derselben App. Was passt am besten?
Eine Statusseite aktualisiert einmal pro Stunde ein Diagramm, und es wird nie etwas an den Server zurückgesendet. Was passt am besten?
Was bedeutet Vollduplex bei einem WebSocket?
Ein WebSocket beginnt als gewöhnliche HTTP-Anfrage, und eine HTTP-Anfrage erwartet eine Antwort und ist dann fertig. Wie kann aus dieser Anfrage eine Verbindung werden, die nie endet? Das ist das Rätsel von Kapitel 2, in dem du beide Seiten des Eröffnungs-Handshakes selbst schreibst.