📚 Documentation MateZone
Documentation technique complète basée sur le code source du projet.
📁 Structure du projet
Organisation des packages dans /src
client/
Application cliente JavaFX avec architecture MVC.
MainClient.javacontroleur/ihm/metier/infrastructure/
server/
Serveur WebSocket avec couche métier et accès BD.
MainServer.javaProtocol/webSocket/metier/service/bd/repository/
common/
Éléments partagés entre client et serveur.
dto/ChatEventDTO.javaprotocol/EventEnum.java
💻 Client - Architecture MVC
Classes principales de l'application cliente
🚀 MainClient
Point d'entrée de l'application cliente. Charge la configuration depuis
config.properties et lance le contrôleur.
// src/client/MainClient.java
public static void main(String[] args) {
// Chargement config
Properties props = new Properties();
props.load(new FileInputStream("src/client/config.properties"));
ADRESSE = props.getProperty("server.URL");
CHATPORT = Integer.parseInt(props.getProperty("serverChat.PORT"));
IMGPORT = Integer.parseInt(props.getProperty("serverImg.PORT"));
// Lancement
Controleur controleur = new Controleur(ADRESSE, CHATPORT, IMGPORT);
controleur.lancerApp();
}
🎮 Controleur
Contrôleur principal implémentant INotifieur. Orchestre l'IHM, le métier et la
connexion WebSocket.
// src/client/controleur/Controleur.java
public class Controleur implements INotifieur {
private IhmGui ihmGui;
private Metier metier;
public Controleur(String ADRESSE, int CHATPORT, int IMGPORT) {
this.ihmGui = new IhmGui(this);
INotifieur iNotifieur = this;
IEnvoyeur iEnvoyeur = new WebSocketChatAdapter(
"ws://" + ADRESSE + CHATPORT, iNotifieur
);
iEnvoyeur.connecter();
this.metier = new Metier(iEnvoyeur, iNotifieur);
}
public void lancerApp() {
this.ihmGui.lancerConnexionFrame();
}
}
⚙️ Metier
Couche métier gérant la logique business, l'état du client connecté et la création des
ChatEventDTO.
// src/client/metier/Metier.java
public class Metier {
private final IEnvoyeur iEnvoyeur;
private final INotifieur iNotifieur;
private int idChannel, idClient;
private String pseudoClient;
public void connecterAuClient(String pseudo, String mdp) {
ChatEventDTO event = new ChatEventDTO(EventEnum.LOGIN)
.add(EventEnum.LOGIN.getKeyIndex(0), pseudo)
.add(EventEnum.LOGIN.getKeyIndex(1), mdp);
this.iEnvoyeur.envoyer(event);
}
public void setClient(int idClient, String pseudoClient) {
this.idClient = idClient;
this.pseudoClient = pseudoClient;
this.iNotifieur.succesLogin(this.pseudoClient);
}
}
🖼️ IhmGui
Gestion de l'interface graphique JavaFX via JavaFXApplicationManager. Affiche
les fenêtres et notifie les événements.
// src/client/ihm/IhmGui.java
public class IhmGui {
private Controleur controleur;
private MateZoneFrame mateZoneFrame;
private JavaFXApplicationManager javaFXManager;
public void lancerConnexionFrame() {
this.javaFXManager.creerEtAfficherConnexion(this.controleur);
}
public void lancerMateZoneFrame(String pseudo) {
Platform.runLater(() -> {
this.javaFXManager.fermerConnexion();
this.mateZoneFrame = new MateZoneFrame(this.controleur);
this.mateZoneFrame.afficherFrame();
});
}
public void afficherNvMessage(ChatEventDTO eventDTO) {
if (this.mateZoneFrame != null)
Platform.runLater(() ->
this.mateZoneFrame.afficherNvMessage(eventDTO)
);
}
}
🔌 Interfaces Client
IEnvoyeur
Interface d'envoi vers le serveur.
// src/client/metier/interfaces/IEnvoyeur.java
public interface IEnvoyeur {
void envoyer(ChatEventDTO event);
void connecter();
}
INotifieur
Interface de notification vers l'IHM.
// src/client/metier/interfaces/INotifieur.java
public interface INotifieur {
void succesLogin(String pseudo);
void afficherErreur(String message);
void recevoirMessage(ChatEventDTO event);
// ...
}
🌐 WebSocketChatAdapter
Adaptateur WebSocket implémentant IEnvoyeur. Gère la connexion et la
sérialisation JSON via Gson.
// src/client/infrastructure/websocket/WebSocketChatAdapter.java
public class WebSocketChatAdapter extends WebSocketClient implements IEnvoyeur {
private final INotifieur iNotifieur;
private Gson gson = new Gson();
public WebSocketChatAdapter(String serverUri, INotifieur iNotifieur) throws Exception {
super(new URI(serverUri));
this.iNotifieur = iNotifieur;
}
@Override
public void envoyer(ChatEventDTO event) {
if (!this.isOpen()) {
System.err.println("Erreur serveur");
return;
}
String json = gson.toJson(event);
this.send(json);
}
@Override
public void connecter() {
if (!this.isOpen())
this.connectBlocking();
}
}
🖥️ Serveur - Architecture en couches
Classes principales du serveur MateZone
🚀 MainServer
Point d'entrée serveur. Initialise la BD, les repositories, les services et démarre les serveurs WebSocket et HTTP.
// src/server/MainServer.java
public static void main(String[] args) throws Exception {
// 1) Connexion BD
ConnexionBD bd = ConnexionBD.getInstance();
// 2) Repositories
IMessageRepository messageRepo = new MessageRepository();
IUtilisateurRepository userRepo = new UtilisateurRepository();
// 3) Services Métier
ClientService userService = new ClientService(userRepo, messageRepo);
// 4) Serveur WebSocket
WebSocketMateZone wsServer = new WebSocketMateZone(PORTMESS, userService);
wsServer.start();
userService.setIWebSocketMateZone(wsServer);
// 5) Serveur HTTP avatar
MainServer.startAvatarServer(userRepo);
}
🔌 WebSocketMateZone
Serveur WebSocket principal implémentant IWebSocketMateZone. Gère les connexions
et dispatch vers ClientService.
// src/server/Protocol/webSocket/WebSocketMateZone.java
public class WebSocketMateZone extends WebSocketServer
implements IWebSocketMateZone {
private ClientService clientService;
private HashMap<WebSocket, Integer> hsClientChannel;
@Override
public void onMessage(WebSocket client, String message) {
ChatEventDTO event = ChatEventDTO.jsonToEventDTO(message);
switch (event.getType()) {
case LOGIN:
clientService.handleLogin(client, event);
break;
case SIGNUP:
clientService.handleSignup(client, event);
break;
case NEW_MESSAGE:
clientService.handleNewMessage(client, event);
break;
case NEW_CHANNEL:
clientService.handleNewChannel(client, event);
break;
}
}
public void broadcast(int idChannel, ChatEventDTO event) {
for (WebSocket client : hsClientChannel.keySet()) {
if (hsClientChannel.get(client) == idChannel)
client.send(event.toJson());
}
}
}
👤 ClientService
Service métier gérant l'authentification, l'inscription, l'envoi de messages et la gestion des canaux.
// src/server/metier/service/ClientService.java
public class ClientService {
private final IUtilisateurRepository iUserRep;
private final IMessageRepository iMesRep;
private IWebSocketMateZone iWebSocketMateZone;
public void handleLogin(WebSocket client, ChatEventDTO eventRec) {
String pseudo = (String) eventRec.getDataIndex(0);
String mdp = (String) eventRec.getDataIndex(1);
int idClient = this.iUserRep.authenticate(pseudo, mdp);
if (idClient == -1) {
ChatEventDTO error = new ChatEventDTO(EventEnum.ERROR)
.add(EventEnum.ERROR.getKeyIndex(0), "Client introuvable");
client.send(error.toJson());
} else {
ChatEventDTO success = new ChatEventDTO(EventEnum.SUCCESS_LOGIN)
.add(EventEnum.SUCCESS_LOGIN.getKeyIndex(0), idClient)
.add(EventEnum.SUCCESS_LOGIN.getKeyIndex(1), pseudo);
client.send(success.toJson());
}
}
}
🗄️ ConnexionBD
Singleton gérant la connexion MySQL. Charge la configuration depuis
config.properties.
// src/server/bd/ConnexionBD.java
public class ConnexionBD {
private static ConnexionBD instance;
private static String URL, USERNAME, PASSWORD;
private Connection connection;
static {
Properties props = new Properties();
props.load(new FileInputStream("src/server/config.properties"));
URL = props.getProperty("db.url");
USERNAME = props.getProperty("db.username");
PASSWORD = props.getProperty("db.password");
}
private ConnexionBD() {
Class.forName("com.mysql.cj.jdbc.Driver");
this.connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
}
public static ConnexionBD getInstance() {
if (instance == null)
instance = new ConnexionBD();
return instance;
}
public Connection getConnection() {
return this.connection;
}
}
📦 Repositories
UtilisateurRepository
Implémente IUtilisateurRepository. Gère CRUD et authentification des
clients.
// src/server/bd/repository/UtilisateurRepository.java
public class UtilisateurRepository implements IUtilisateurRepository {
private ConnexionBD connexionBD;
public int authenticate(String pseudo, String mdp) {
String sql = "SELECT id, mdp FROM clients WHERE pseudo = ?";
// Vérifie le hash avec PasswordUtil
}
public Client getClientById(int id) { ... }
public void createClient(String pseudo, String mdp) { ... }
}
MessageRepository
Implémente IMessageRepository. Gère l'envoi et la récupération des messages.
// src/server/bd/repository/MessageRepository.java
public class MessageRepository implements IMessageRepository {
private ConnexionBD connexionBD;
public int sendMessage(int groupe_id, int idUser, String message) {
String sql = "INSERT INTO messages " +
"(groupe_id, expediteur_id, contenu) VALUES (?, ?, ?)";
// Exécute et retourne l'ID du message
}
public List<Message> getMessages(int groupeId) { ... }
}
🔗 Common - Éléments partagés
Classes utilisées par le client ET le serveur
📦 ChatEventDTO
DTO (Data Transfer Object) standardisant les échanges JSON entre client et serveur.
// src/common/dto/ChatEventDTO.java
public class ChatEventDTO {
private EventEnum type;
private Map<String, Object> data;
private List<ChatEventDTO> lstEventDTO;
// Constructeurs
public ChatEventDTO() { this.data = new HashMap<>(); }
public ChatEventDTO(EventEnum type) { this(); this.type = type; }
public ChatEventDTO(EventEnum type, List<ChatEventDTO> lst) { ... }
// Builder pattern
public ChatEventDTO add(String key, Object value) {
this.data.put(key, value);
return this;
}
// Sérialisation JSON (Gson)
public String toJson() {
return new Gson().toJson(this);
}
public static ChatEventDTO jsonToEventDTO(String json) {
return new Gson().fromJson(json, ChatEventDTO.class);
}
// Accès par index selon EventEnum
public Object getDataIndex(int index) {
String key = this.type.getRequiredKeys().get(index);
return this.data.get(key);
}
}
🏷️ EventEnum
Énumération définissant tous les types d'événements et leurs clés requises.
// src/common/protocol/EventEnum.java
public enum EventEnum {
LOGIN(List.of("pseudo", "mdp")),
SIGNUP(List.of("pseudo", "mdp")),
SUCCESS_LOGIN(List.of("id", "pseudo")),
SUCCESS_SIGNUP(List.of("id", "pseudo")),
NEW_CHANNEL(List.of("idChannel")),
MESSAGE(List.of("idClient", "pseudo", "contenu", "date")),
MESSAGE_LIST(List.of()),
NEW_MESSAGE(List.of("idClient", "idChannel", "contenu")),
NEW_MESSAGE_IMG(List.of("IdGroupe", "idClient", "byte")),
SUCCESS(List.of("message")),
ERROR(List.of("message")),
PERMS_CHANNELS(List.of()),
PERM_CHANNEL(List.of("idChannel", "nomChannel")),
CHANGER_CHANNEL(List.of("idChannel"));
private final List<String> composants;
public List<String> getRequiredKeys() {
return this.composants;
}
public String getKeyIndex(int index) {
if (index >= this.composants.size()) return null;
return this.composants.get(index);
}
}
⚙️ Fichiers de configuration
Paramétrage du client et du serveur
📄 Client - config.properties
Configuration de la connexion au serveur.
# src/client/config.properties
# Adresse du serveur WebSocket
server.URL=127.0.0.1:
# Port du serveur de chat
serverChat.PORT=8080
# Port du serveur d'images
serverImg.PORT=8081
📄 Server - config.properties
Configuration du serveur et de la base de données.
# src/server/config.properties
# Base de données MySQL
db.url=jdbc:mysql://localhost:3306/matezone
db.username=root
db.password=votre_mot_de_passe
# Port du serveur WebSocket
server.port=8080
# Port du serveur HTTP (avatars)
web.port=8081
⚠️ Sécurité
Ne committez jamais vos identifiants réels dans config.properties. Utilisez des
variables d'environnement ou un fichier .env ignoré par Git.
📋 Récapitulatif des classes
Vue d'ensemble de toutes les classes du projet
| Classe | Package | Responsabilité | Javadoc |
|---|---|---|---|
MainClient |
client | Point d'entrée client, charge config et lance Controleur | 📖 |
Controleur |
client.controleur | Contrôleur MVC, implémente INotifieur | 📖 |
Metier |
client.metier | Logique métier client, création des ChatEventDTO | 📖 |
IhmGui |
client.ihm | Gestionnaire de l'interface JavaFX | 📖 |
WebSocketChatAdapter |
client.infrastructure.websocket | Adaptateur WebSocket implémentant IEnvoyeur | 📖 |
MainServer |
server | Point d'entrée serveur, initialise BD et services | 📖 |
WebSocketMateZone |
server.Protocol.webSocket | Serveur WebSocket, dispatch vers ClientService | 📖 |
ClientService |
server.metier.service | Service métier (login, signup, messages, canaux) | 📖 |
ConnexionBD |
server.bd | Singleton de connexion MySQL | 📖 |
UtilisateurRepository |
server.bd.repository | CRUD et authentification des clients | 📖 |
MessageRepository |
server.bd.repository | Gestion des messages en BD | 📖 |
ChatEventDTO |
common.dto | DTO standardisé pour échanges JSON | 📖 |
EventEnum |
common.protocol | Énumération des types d'événements et clés requises | 📖 |
📚 Ressources complémentaires
Documentation et liens utiles
Javadoc complète
Documentation générée automatiquement de toutes les classes, méthodes et interfaces.
Consulter la JavadocProtocole WebSocket
Documentation détaillée du protocole de communication avec exemples JSON.
Voir le protocole