Implémentation d'un service de communication en temps réel avec WebSocket : architecture frontend-backend séparée

Mise en place du backend

1. Importation des dépendances

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

2. Configuraton du serveur WebSocket

Fichier de configuration WebSocketConfig

package com.example.websocketapp.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@Configuration
public class ConfigurationWebSocket {

    @Bean
    public ServerEndpointExporter exporter() {
        return new ServerEndpointExporter();
    }
}

Serveur WebSocket

package com.example.websocketapp.serveur;

import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

@ServerEndpoint("/ws/point/{utilisateur}")
@Component
public class ServeurWebSocket {

    private static final CopyOnWriteArraySet<ServeurWebSocket> connexions = new CopyOnWriteArraySet<>();
    private Session session;
    private String identifiantUtilisateur = "";

    @OnOpen
    public void ouvrir(Session session, @PathParam("utilisateur") String utilisateur) {
        this.identifiantUtilisateur = utilisateur;
        this.session = session;
        connexions.add(this);
        envoyerMessage("Connexion établie");
    }

    @OnClose
    public void fermer() {
        connexions.remove(this);
    }

    @OnMessage
    public void recevoir(String message, Session session) {
        System.out.println("Message reçu de [" + message + "]");
    }

    @OnError
    public void erreur(Session session, Throwable erreur) {
        erreur.printStackTrace();
    }

    public void envoyerMessage(String message) {
        try {
            if (this.session != null) {
                this.session.getBasicRemote().sendText(message);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void envoyerAUtilisateur(String utilisateur, String message) {
        for (ServeurWebSocket connexion : connexions) {
            if (connexion.identifiantUtilisateur.equals(utilisateur)) {
                connexion.envoyerMessage(message);
            }
        }
    }
}

Contrôleur pour tester l'envoi de messages

@GetMapping("/testenvoi")
public String envoyerMessage(String identifiant) {
    ServeurWebSocket.envoyerAUtilisateur(identifiant, "Message du serveur");
    return "succès";
}

Mise en place du frontend

Composant Vue.js

<template>
  <div class="websocket-container">
    <button @click="transmettreMessage('Test')">Envoyer</button>
    <div v-for="(msg, index) in listeMessages" :key="index">
      {{ msg }}
    </div>
  </div>
</template>
<script>
export default {
  name: 'ComposantWebSocket',
  data() {
    return {
      listeMessages: [],
      socket: null
    };
  },
  mounted() {
    this.établirConnexion();
  },
  beforeDestroy() {
    if (this.socket) {
      this.socket.close();
    }
  },
  methods: {
    établirConnexion() {
      const url = 'ws://localhost:8080/ws/point/utilisateur1';
      if (typeof WebSocket !== 'undefined') {
        this.socket = new WebSocket(url);
        this.socket.onopen = this.ouverture;
        this.socket.onmessage = this.receptionMessage;
        this.socket.onerror = this.erreur;
        this.socket.onclose = this.fermeture;
      }
    },
    ouverture() {
      this.transmettreMessage('Connexion réussie');
    },
    erreur() {
      console.log('Échec de la connexion');
    },
    fermeture() {
      console.log('Connexion fermée');
    },
    receptionMessage(event) {
      this.listeMessages.push(event.data);
    },
    transmettreMessage(texte) {
      if (this.socket) {
        this.socket.send(texte);
      }
    }
  }
};
</script>

Pour tester, appelez le point de terminaison du contrôleur avec un identifiant utilisateur pour envoyer un message au frontend via WebSocket.

Étiquettes: WebSocket Spring Boot Vue.js Java JavaScript

Publié le 17 juin à 21h08