Analyse des besoins & modélisation
La première phase consiste à analyser les besoins fonctionnels de l'application et à les traduire en un modèle de données cohérent, avant toute ligne de code Java.
Utilisateurs
Comptes avec pseudo unique, email, mot de passe hashé et date d'inscription.
Serveurs
Espaces collaboratifs créés par un utilisateur, avec nom et description.
Salons
Canaux textuels organisés par serveur, chacun avec un nom.
Messages
Messages horodatés, liés à un utilisateur et un salon.
Membres & Rôles
Appartenance d'un utilisateur à un serveur avec rôle (admin / modo / membre).
Modèle logique de données (MLD)
Table UTILISATEUR
| Colonne | Type | Contrainte |
|---|---|---|
| id_utilisateur PK | INT AUTO_INCREMENT | NOT NULL |
| pseudo | VARCHAR(50) | NOT NULL UNIQUE |
| VARCHAR(100) | NOT NULL UNIQUE | |
| mot_de_passe | VARCHAR(255) | NOT NULL (hashé) |
| date_inscription | DATETIME | DEFAULT NOW() |
Table SERVEUR
| Colonne | Type | Contrainte |
|---|---|---|
| id_serveur PK | INT AUTO_INCREMENT | NOT NULL |
| nom | VARCHAR(100) | NOT NULL |
| description | TEXT | — |
| id_proprietaire FK | INT | → UTILISATEUR |
| date_creation | DATETIME | DEFAULT NOW() |
Table MESSAGE
| Colonne | Type | Contrainte |
|---|---|---|
| id_message PK | INT AUTO_INCREMENT | NOT NULL |
| contenu | TEXT | NOT NULL |
| date_envoi | DATETIME | DEFAULT NOW() |
| id_utilisateur FK | INT | → UTILISATEUR |
| id_salon FK | INT | → SALON |
Table MEMBRE (association Utilisateur ↔ Serveur)
| Colonne | Type | Contrainte |
|---|---|---|
| id_utilisateur PK FK | INT | → UTILISATEUR |
| id_serveur PK FK | INT | → SERVEUR |
| role | ENUM('admin','modo','membre') | DEFAULT 'membre' |
| date_adhesion | DATETIME | DEFAULT NOW() |
Extrait du script SQL
CREATE TABLE UTILISATEUR (
id_utilisateur INT AUTO_INCREMENT PRIMARY KEY,
pseudo VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE,
mot_de_passe VARCHAR(255) NOT NULL,
date_inscription DATETIME DEFAULT NOW()
);
-- Table de jointure MEMBRE
CREATE TABLE MEMBRE (
id_utilisateur INT NOT NULL,
id_serveur INT NOT NULL,
role ENUM('admin','modo','membre') DEFAULT 'membre',
PRIMARY KEY (id_utilisateur, id_serveur),
FOREIGN KEY (id_utilisateur) REFERENCES UTILISATEUR(id_utilisateur),
FOREIGN KEY (id_serveur) REFERENCES SERVEUR(id_serveur)
);
Architecture de l'application
La deuxième phase consiste à développer l'application qui exploite la base de données conçue en première partie. L'architecture retenue est un modèle client-serveur reposant sur des sockets TCP.
Interface Swing
Socket TCP
Threads par client
Diffusion messages
JDBC
Persistance
Sockets TCP
Communication fiable via ServerSocket / Socket Java.
Multi-threading
Un thread par client pour gérer les échanges en parallèle.
Interface Swing
Liste des serveurs, salons et fenêtre de chat en trois colonnes.
Authentification
Vérification pseudo / mot de passe hashé avant accès à l'application.
Temps réel
Messages redistribués instantanément à tous les membres du salon.
JDBC
Persistance des messages et rechargement à la connexion.
Extrait de code — Gestionnaire de client (serveur)
public class ClientHandler implements Runnable {
private final Socket socket;
private BufferedReader in;
private PrintWriter out;
public ClientHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
String message;
while ((message = in.readLine()) != null) {
Serveur.diffuser(message, this); // broadcast à tous les clients
MessageDAO.sauvegarder(message); // persistance JDBC
}
} catch (IOException e) {
System.out.println("Client déconnecté : " + socket.getInetAddress());
}
}
}