Server-Sent Events en Java : quand WebSocket est excessif et HTTP insuffisant
\n\nAvez-vous déjà réfléchi au fonctionnement des flux d'actualités sur Twitter, des notifications dans Telegram ou des résultats sportifs en direct ? Les données semblent arriver toutes seules, sans actualisation de la page. Le secret est simple : Server-Sent Events (SSE) — une technologie qui permet au serveur d'envoyer des données au client en temps réel via une connexion HTTP classique.
\n\nDans cet article, nous allons explorer les Server-Sent Events en Java. Vous apprendrez pourquoi SSE est souvent plus pratique que WebSocket, comment configurer un serveur avec l'API Java Servlet, et comment recevoir des événements côté client. Le code sera fonctionnel, le style vivant, et les exemples aussi proches que possible des cas réels.
\n\nQue sont les Server-Sent Events et pourquoi en avez-vous besoin ?
\n\nLes Server-Sent Events (SSE) sont une norme W3C qui permet au serveur de « pousser » des données vers le client via une seule connexion HTTP persistante. Le client s'abonne à un flux d'événements et le serveur envoie des messages au fur et à mesure de leur apparition.
\n\nSSE est idéal pour :
\n- \n
- Notifications — nouveaux e-mails, messages, changements de statut. \n
- Flux d'actualités — publications, tweets, taux de change. \n
- Surveillance — journaux, métriques serveur, progression des tâches. \n
- Données en direct — cotations boursières, résultats sportifs, météo. \n
Contrairement à WebSocket, SSE fonctionne uniquement dans un sens (serveur → client), mais cela suffit pour la plupart des scénarios. De plus, SSE utilise HTTP standard, ne nécessite pas de ports supplémentaires et traverse facilement les proxies et pare-feux.
\n\nServer-Sent Events vs WebSocket : que choisir ?
\n\nSi vous avez seulement besoin d'envoyer des données du serveur au client (sans retour), choisissez SSE. C'est plus simple, plus léger et moins coûteux. WebSocket est justifié lorsque le client envoie également activement des données (par exemple, dans les chats ou les jeux en ligne).
\n\n| Critère | \nServer-Sent Events | \nWebSocket | \n
|---|---|---|
| Direction | \nServeur → Client | \nBidirectionnelle | \n
| Protocole | \nHTTP/1.1, HTTP/2 | \nws:// ou wss:// | \n
| Reconnexion automatique | \nOui (intégrée au navigateur) | \nNon (à implémenter) | \n
| Complexité d'implémentation | \nFaible | \nMoyenne/Élevée | \n
| Support des navigateurs | \nTous les navigateurs modernes | \nTous les navigateurs modernes | \n
Pour le site éducatif PythonLib, nous avons choisi Java car c'est un langage fiable pour le développement serveur. C'est parti !
\n\nPartie serveur : implémentation SSE en Java avec l'API Servlet
\n\nCommençons par le serveur. La méthode la plus simple consiste à utiliser les Servlets Java standard. Nous devons :
\n- \n
- Définir l'en-tête
Content-Type: text/event-stream. \n - Désactiver la mise en cache (
Cache-Control: no-cache). \n - Maintenir la connexion ouverte. \n
- Envoyer les données au format
data: ...\\n\\n. \n
Exemple 1 : Serveur SSE simple avec Java Servlet
\n\nCréons une servlet qui envoie l'heure actuelle toutes les 5 secondes.
\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