Introduction à WebSocket en Java : de la théorie aux applications en temps réel
Les applications web modernes nécessitent de plus en plus un échange instantané de données entre le client et le serveur. Le HTTP traditionnel avec son modèle « requête-réponse » est peu adapté aux tâches nécessitant une connexion permanente : chats en ligne, cotations boursières, jeux multijoueurs ou tableaux de bord. C'est ici que le protocole WebSocket vient à la rescousse, en établissant une connexion bidirectionnelle permanente. Dans cet article, nous allons voir comment implémenter WebSocket en Java, créer un simple serveur de chat et un client, et examiner les meilleures pratiques pour un environnement de production.
Qu'est-ce que WebSocket et pourquoi Java ?
WebSocket est un protocole fonctionnant au-dessus de TCP, qui permet d'échanger des messages en temps réel sans le surcoût des en-têtes HTTP. Après la poignée de main (passage de HTTP à WebSocket), le serveur et le client peuvent s'envoyer des données à tout moment. Java est un excellent choix pour implémenter WebSocket grâce à :
- Un support intégré dans Jakarta EE (anciennement Java EE) via JSR 356.
- Une haute performance et le multithreading.
- Un écosystème de frameworks (Spring, Netty, Tyrus) simplifiant le développement.
Contrairement au polling et aux SSE (Server-Sent Events), WebSocket assure une communication bidirectionnelle complète sans latence.
Architecture d'une application WebSocket en Java
Une application temps réel typique en Java comprend trois composants :
- Serveur WebSocket — accepte les connexions, gère les sessions, traite les messages entrants.
- Client WebSocket — navigateur (JavaScript) ou application Java native qui initie la connexion.
- Logique métier — traitement des messages, diffusion, sauvegarde en base de données.
Examinons l'implémentation du serveur à l'aide des annotations Jakarta WebSocket et du client en JavaScript.
Partie serveur : annotations @ServerEndpoint
Pour créer un serveur, il suffit d'ajouter la dépendance jakarta.websocket-api (ou javax.websocket-api pour les anciennes versions). Exemple d'un simple serveur d'écho :
import jakarta.websocket.*;import jakarta.websocket.server.ServerEndpoint;import java.io.IOException;
@ServerEndpoint("/echo")public class EchoEndpoint {
@OnOpen public void onOpen(Session session) { System.out.println("Nouvelle connexion : " + session.getId()); }
@OnMessage public void onMessage(String message, Session session) throws IOException { System.out.println("Reçu : " + message); // Renvoie (écho) session.getBasicRemote().sendText("Écho : " + message); }
@OnClose public void onClose(Session session, CloseReason reason) { System.out.println("Connexion fermée : " + reason.getReasonPhrase()); }
@OnError public void onError(Session session, Throwable error) { error.printStackTrace(); }}Le serveur est déployé dans n'importe quel conteneur Servlet (Tomcat, Jetty, GlassFish). Pour Spring Boot, utilisez @ServerEndpoint avec SpringBootApplication.
Partie cliente : JavaScript
Le client navigateur se connecte via l'API WebSocket standard :
const socket = new WebSocket("ws://localhost:8080/echo");
socket.onopen = function(event) { console.log("Connexion établie"); socket.send("Bonjour, serveur !");};
socket.onmessage = function(event) { console.log("Message du serveur : " + event.data);};
socket.onclose = function(event) { console.log("Connexion fermée");};Notez que l'URL commence par ws:// (ou wss:// pour une connexion sécurisée).
Création d'un chat en temps réel en Java
Construisons maintenant un chat compl