Server-Sent Events in Java: Wenn WebSocket zu viel ist und HTTP nicht ausreicht
\n\nHaben Sie sich jemals gefragt, wie die Newsfeeds in Twitter, Benachrichtigungen in Telegram oder Live-Ergebnisse von Sportereignissen funktionieren? Scheinbar kommen die Daten von selbst, ohne dass die Seite aktualisiert werden muss. Das Geheimnis ist einfach: Server-Sent Events (SSE) – eine Technologie, die es dem Server ermöglicht, Daten in Echtzeit über eine normale HTTP-Verbindung an den Client zu senden.
\n\nIn diesem Artikel werden wir Server-Sent Events in Java behandeln. Sie erfahren, warum SSE oft praktischer als WebSocket ist, wie Sie einen Server mit der Java Servlet API einrichten und wie Sie Ereignisse auf dem Client empfangen. Der Code ist funktionsfähig, der Stil lebendig und die Beispiele sind so praxisnah wie möglich.
\n\nWas sind Server-Sent Events und wozu braucht man sie?
\n\nServer-Sent Events (SSE) sind ein W3C-Standard, der es dem Server ermöglicht, Daten über eine einzige langlebige HTTP-Verbindung an den Client zu „pushen". Der Client abonniert einen Ereignisstrom, und der Server sendet Nachrichten, sobald sie auftreten.
\n\nSSE eignet sich ideal für:
\n- \n
- Benachrichtigungen – neue E-Mails, Nachrichten, Statusänderungen. \n
- Newsfeeds – Beiträge, Tweets, Wechselkurse. \n
- Monitoring – Logs, Servermetriken, Aufgabenfortschritt. \n
- Live-Daten – Aktienkurse, Sportergebnisse, Wetter. \n
Im Gegensatz zu WebSocket funktioniert SSE nur in eine Richtung (Server → Client), aber das reicht für die meisten Szenarien aus. Außerdem verwendet SSE normales HTTP, benötigt keine zusätzlichen Ports und passiert problemlos Proxys und Firewalls.
\n\nServer-Sent Events vs. WebSocket: Was wählen?
\n\nWenn Sie nur Daten vom Server an den Client senden müssen (ohne Rückkanal), wählen Sie SSE. Es ist einfacher, leichter und günstiger. WebSocket ist gerechtfertigt, wenn der Client ebenfalls aktiv Daten sendet (z. B. in Chats oder Online-Spielen).
\n\n| Kriterium | \nServer-Sent Events | \nWebSocket | \n
|---|---|---|
| Richtung | \nServer → Client | \nBidirektional | \n
| Protokoll | \nHTTP/1.1, HTTP/2 | \nws:// oder wss:// | \n
| Automatische Wiederverbindung | \nJa (im Browser integriert) | \nNein (muss implementiert werden) | \n
| Implementierungsaufwand | \nNiedrig | \nMittel/Hoch | \n
| Browserunterstützung | \nAlle modernen | \nAlle modernen | \n
Für die Bildungswebsite PythonLib haben wir Java gewählt, weil es eine zuverlässige Sprache für die Serverentwicklung ist. Los geht's!
\n\nServerseite: Implementierung von SSE in Java mit der Servlet API
\n\nBeginnen wir mit dem Server. Der einfachste Weg ist die Verwendung von Standard-Java-Servlets. Wir benötigen:
\n- \n
- Setzen des Headers
Content-Type: text/event-stream. \n - Deaktivieren des Cachings (
Cache-Control: no-cache). \n - Die Verbindung offen halten. \n
- Daten im Format
data: ...\\n\\nsenden. \n
Beispiel 1: Einfacher SSE-Server mit Java Servlet
\n\nErstellen wir ein Servlet, das alle 5 Sekunden die aktuelle Uhrzeit sendet.
\n\nimport javax.servlet.ServletException;\nimport javax.servlet.annotation.WebServlet;\nimport javax.servlet.http.HttpServlet;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.io.PrintWriter;\nimport java.time.LocalTime;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.ScheduledExecutorServ