SAÉ BUT2 · Semestre 3 · 2025

Application de messagerie
Base de données & Java

Conception de la BDD, puis développement d'une application client-serveur Java — inspiré de Discord

SQL / MCD / MLD Java · Sockets TCP JDBC 2025
Phase 1 — Conception de la base de données

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

ColonneTypeContrainte
id_utilisateur PKINT AUTO_INCREMENTNOT NULL
pseudoVARCHAR(50)NOT NULL UNIQUE
emailVARCHAR(100)NOT NULL UNIQUE
mot_de_passeVARCHAR(255)NOT NULL (hashé)
date_inscriptionDATETIMEDEFAULT NOW()

Table SERVEUR

ColonneTypeContrainte
id_serveur PKINT AUTO_INCREMENTNOT NULL
nomVARCHAR(100)NOT NULL
descriptionTEXT
id_proprietaire FKINT→ UTILISATEUR
date_creationDATETIMEDEFAULT NOW()

Table MESSAGE

ColonneTypeContrainte
id_message PKINT AUTO_INCREMENTNOT NULL
contenuTEXTNOT NULL
date_envoiDATETIMEDEFAULT NOW()
id_utilisateur FKINT→ UTILISATEUR
id_salon FKINT→ SALON

Table MEMBRE (association Utilisateur ↔ Serveur)

ColonneTypeContrainte
id_utilisateur PK FKINT→ UTILISATEUR
id_serveur PK FKINT→ SERVEUR
roleENUM('admin','modo','membre')DEFAULT 'membre'
date_adhesionDATETIMEDEFAULT NOW()

Extrait du script SQL

-- Table UTILISATEUR
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)
);
Phase 2 — Développement Java

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.

Client Java

Interface Swing
Socket TCP

Serveur Java

Threads par client
Diffusion messages

Base de données

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)

// Thread dédié à chaque client connecté
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());
    }
  }
}
← Retour au portfolio