WebSocket en Java : applications temps réel avancées

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

WebSocket en Java : création d'applications temps réel de niveau avancé



Les applications web modernes exigent de plus en plus un transfert instantané de données entre le client et le serveur. Le HTTP traditionnel, basé sur les requêtes-réponses, est inefficace pour les tâches où la latence est critique : chats en ligne, cotations boursières, édition collaborative de documents ou serveurs de jeux. Le protocole WebSocket résout ce problème en établissant une connexion bidirectionnelle permanente. Dans cet article, nous explorerons les techniques avancées de travail avec WebSocket en Java, allant au-delà des exemples de base.



1. Architecture d'une application WebSocket avancée en Java



L'exemple de base de WebSocket en Java utilisant l'annotation @ServerEndpoint est bon pour l'apprentissage, mais pour les solutions de production, une architecture plus robuste est nécessaire. Examinons les composants clés.



1.1. Choix de la pile technologique

Pour les applications d'entreprise, la norme de facto est Spring Boot avec le module spring-boot-starter-websocket. Il offre une intégration avec STOMP (Simple Text Oriented Messaging Protocol) — un sous-protocole au-dessus de WebSocket qui ajoute le routage des messages, les files d'attente et les abonnements.



1.2. Configuration de base de WebSocket dans Spring Boot

Commençons par la classe de configuration :



@Configuration@EnableWebSocketMessageBrokerpublic class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

@Override public void configureMessageBroker(MessageBrokerRegistry config) { // Courtier intégré pour les files /topic et /queue config.enableSimpleBroker("/topic", "/queue"); // Préfixe pour les messages du client vers le serveur config.setApplicationDestinationPrefixes("/app"); // Préfixe pour les files d'attente utilisateur (point à point) config.setUserDestinationPrefix("/user"); }

@Override public void registerStompEndpoints(StompEndpointRegistry registry) { // Point de terminaison pour la connexion via SockJS (fallback pour les anciens navigateurs) registry.addEndpoint("/ws") .setAllowedOrigins("*") .withSockJS(); }}


Ce code configure les points de connexion, les préfixes pour le routage et le courtier de messages intégré. L'utilisation de STOMP simplifie considérablement la gestion des abonnements et des files d'attente.



2. Traitement avancé des messages : du chat aux données boursières



Passons maintenant à l'implémentation de scénarios spécifiques. Examinons trois cas typiques : le chat de groupe, les notifications personnelles et le streaming de données.



2.1. Chat de groupe avec historique des messages

Un chat simple est une diffusion de messages dans un topic. Complexifions la tâche : ajoutons la sauvegarde de l'historique et le filtrage par salons.



@Controllerpublic class ChatController {

@Autowired private ChatMessageRepository repository; // Référentiel JPA

@MessageMapping("/chat.sendMessage") @SendTo("/topic/chat/{roomId}") public ChatMessage sendMessage(@Payload ChatMessage message, @DestinationVariable String roomId, SimpMessageHeaderAccessor headerAccessor) { // Sauvegarde dans la base de données message.setTimestamp(Instant.now()); repository.save(message); // Ajout des informations sur l'expéditeur depuis la session String username = (String) headerAccessor.getSessionAttributes().get("username"); message.setSender(username); return message; }

@MessageMapping("/chat.addUser") @SendTo("/topic/chat/{roomId}") public ChatMessage addUser(@Payload ChatMessage message, @DestinationVariable String roomId, SimpMessageHeaderAccessor headerAccessor) { headerAccessor.getSessionAttributes().put("username", message.getSender()); return message; }}


Ici, nous utilisons

Blogs

Book Recommendations