Vous intégrez une équipe de développeurs chargée de créer une application cliente pour une plateforme de messagerie instantanée utilisée en réseau local dans un établissement. Baptisée ClassCord, cette solution a pour objectif de permettre aux utilisateurs (professeurs, étudiants) de communiquer en temps réel, de manière fluide et sécurisée.
Le serveur de tchat, déjà en place et géré par les étudiants SISR, fonctionne sur le réseau local. Chaque utilisateur se connecte à l'adresse IP de son choix pour interagir avec le serveur d'un camarade ou avec le serveur central de la salle. Votre formateur vous proposera dès le début du projet son propre serveur opérationnel afin que vous ayez toujours un serveur sur lequel vous pourrez vous connecter.
Réaliser un client Java Swing complet capable de se connecter à un serveur de tchat et d'offrir à l'utilisateur une interface fonctionnelle, réactive et évolutive.
Vous devez mobiliser vos compétences en modélisation, architecture logicielle, programmation réseau, interface graphique et documentation technique. Le tout en suivant une méthodologie de projet itérative, par étapes. Vous serez guidé sur chacune de ces étapes.
🎯 Chaque étudiant doit travailler dans un dépôt GitHub personnel à partir de ce projet.
-
Forkez ce dépôt sur votre propre compte GitHub (bouton “Fork” en haut à droite).
-
Sur votre fork, cliquez sur Code > HTTPS et copiez l’URL.
-
Ouvrez VSCode ou votre terminal et tapez :
git clone https://github.com/votre-identifiant/classcord-client.git cd classcord-client -
Enregistrez votre travail régulièrement :
git add . git commit -m "ex: ajout interface de login" git push origin main
-
Travail exclusivement sur votre fork GitHub
-
Projet avec au moins 1 commit par jour clair et cohérent
-
Un fichier
README.mdpersonnel avec :- votre nom et prénom,
- les fonctionnalités développées,
- les instructions pour lancer le projet
Pour l'occasion, vous apprendrez la syntaxe markdown (md) pour rédiger la documentation.
L'application cliente doit permettre :
- Connexion à un serveur distant (IP + port à saisir)
- Connexion en mode invité (pseudo temporaire)
- Connexion avec compte utilisateur (login / mot de passe)
- Affichage des messages du canal global
- Envoi de messages dans le canal global
- Affichage de la liste des utilisateurs connectés
- Envoi de messages privés
- Affichage de l'état des utilisateurs (disponible / absent / invisible)
- Changement de statut personnel
- Interface conviviale et fluide avec Swing
- Java 11 ou plus
- Interface Swing (JavaFX en option en bonus)
- IDE recommandé : VSCode avec extension Java + Maven
- Bibliothèque JSON :
org.json:json:20231013
- MVC (Modèle-Vue-Contrôleur) qu'on mettra en oeuvre dans le sgrandes lignes nous mêmes, sans framework
- Thread réseau séparé (pour la réception)
- Communication par Socket TCP (pas HTTP)
Tous les échanges entre client et serveur se font en JSON, terminés par un saut de ligne (\n).
{
"type": "message",
"subtype": "global",
"to": "global",
"content": "Bonjour à tous !"
}{
"type": "message",
"subtype": "private",
"to": "bob",
"content": "Salut Bob, dispo ?"
}{
"type": "login",
"username": "alice",
"password": "1234"
}{
"type": "status",
"state": "invisible"
}Les réponses du serveur suivent le même format, avec type, status, message, from, timestamp, etc.
- Les messages entrants sont affichés en temps réel (Thread écouteur)
- L'utilisateur peut envoyer des messages via une zone de saisie
- L'application doit être réactive et ne jamais figer l'IHM
- Toute déconnexion doit être gérée proprement (sans crash)
- Créer un projet Java fonctionnel dans VSCode avec Maven.
- Mettre en place la dépendance
org.json. - Créer la structure du projet (dossiers
model,network,ui, etc.) qui respecte dans le principe la séparation des préoccupations propre au MVC. - Implémenter les classes métier
User,Message. - S'assurer que le projet compile et peut être exécuté (définissez une classe de test, avec quelques instructions intéressantes).
-
Création du projet Maven dans VSCode
- Ouvrir VSCode > Créer un dossier
classcord-client - Ouvrir le terminal VSCode (raccourci : Ctrl + `), et si Maven n'est pas installé sur la machine, commencer par :
- Vérifier Maven avec
mvn -v. - Si la commande est inconnue, suivre le tutoriel d'installation Maven (voir ressource partagée ou demander au formateur).
- Ouvrir VSCode > Créer un dossier
Une fois Maven installé, exécuter la commande suivante dans le terminal selon votre système d'exploitation :
- Windows (CMD ou PowerShell) :
mvn archetype:generateAprès un petit moment, Maven posera plusieurs questions à la suite :
- Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 2251: : Valeur par défaut (Entrée).
- Choose org.apache.maven.archetypes:maven-archetype-quickstart version: : Valeur par défaut (Entrée).
- GroupId :
fr.classcord - ArtifactId :
classcord-client - Version : Valeur par défaut (Entrée)
- Package : Valeur par défaut (Entrée)
- Confirmer avec
YpuisEntrée
➡️ Maven va alors créer un projet complet avec pom.xml, dossier src, etc.
-
Linux / macOS (Terminal Bash ou Zsh) :
mvn archetype:generate -DgroupId=fr.classcord -DartifactId=classcord-client -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
- Ouvrir le projet nouvellement créé.
-
Configurer le fichier pom.xml
-
Ajouter la dépendance JSON dans
<dependencies>:<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20231013</version> </dependency>
-
Puis faîtes clic-droit dans le fichier pom.xml, puis "Reload Projects" (ou Maj + Alt + U si vous ne voyez pas Reload Projects). Ca téléchargera les nouvelles dépendances.
-
Organiser les packages
fr.classcord.modelfr.classcord.networkfr.classcord.uifr.classcord.app
-
Créer les classes de base
Toutes les classes suivantes sont à placer dans le package
fr.classcord.model.-
Message:public class Message { public String type; public String subtype; public String from; public String to; public String content; public String timestamp; // Constructeurs, getters/setters }
-
User:public class User { private String username; private String status; // Constructeurs, getters/setters }
Essayez de bien penser à tout et d'anticiper, dès maintenant, tous les futurs besoins.
-
-
Test de compilation
- Lancer :
mvn compile(vous pouvez aussi compiler sans passer par maven) - Vérifier qu’il n’y a pas d’erreur
- Lancer :
-
(Bonus) Créer un Main minimal
- Créer
Main.javaavec unSystem.out.println("Hello ClassCord");
- Créer
- Projet Maven fonctionnel dans VSCode
pom.xmlconfiguré- Packages Java créés et classes
User/Messagevalides - Compilation sans erreur
- Permettre à l'utilisateur de se connecter au serveur en entrant une IP et un port.
- Envoyer des messages au serveur en tant qu'invité (sans authentification).
- Recevoir des messages en temps réel depuis le serveur.
- Afficher les messages entrants dans la console ou une fenêtre Swing simple.
-
Créer une classe
ClientInvitedans le packagefr.classcord.network- Utiliser une socket TCP pour se connecter au serveur.
- Ouvrir un
PrintWriterpour envoyer des messages. - Ouvrir un
BufferedReaderpour recevoir les messages. - Créer une méthode
connect(String ip, int port)pour initier la connexion. - Créer une méthode
send(String message)pour envoyer une ligne JSON.
-
Gérer l'envoi d'un message JSON depuis la console
-
Créer un objet JSON avec
org.json.JSONObject. -
Remplir les champs requis :
JSONObject message = new JSONObject(); message.put("type", "message"); message.put("subtype", "global"); message.put("to", "global"); message.put("from", pseudo); message.put("content", messageText);
-
Envoyer le message via le
PrintWriter, suivi d’un\n.
-
-
Gérer la réception des messages
- Créer un thread secondaire qui écoute les messages en continu avec
BufferedReader.readLine(). - Afficher chaque message dés qu’il est reçu dans la console (ou future UI).
- Créer un thread secondaire qui écoute les messages en continu avec
-
Interaction avec l'utilisateur dans la console
- Saisir le pseudo en console
- Boucle de lecture de message à envoyer
- Affichage asynchrone des messages reçus
- Le thread réseau de réception doit être indépendant du thread principal.
- Aucun blocage ne doit figer l'application.
- Affichage clair de chaque message reçu (pseudo + contenu).
- Encapsulation de la logique JSON dans la classe
Message(méthodestoJson()etfromJson(String)) - Interface graphique Swing de base (champ de texte + zone d'affichage)
- Classe
ClientInvitefonctionnelle capable de se connecter à un serveur - Envoi et réception de messages JSON en mode invité
- Affichage console ou fenêtre Swing basique
- Implémenter l'inscription et la connexion via identifiants utilisateur.
- Envoyer les données de connexion au serveur selon le protocole JSON.
- Afficher un message de confirmation ou d'erreur selon la réponse.
- Réutiliser le canal d'échange de messages une fois authentifié.
-
Ajout de l'interface de login
- Créer une fenêtre Swing avec deux champs :
username,password+ boutons "Se connecter" / "S'inscrire" - Afficher cette interface au démarrage
- Créer une fenêtre Swing avec deux champs :
-
Envoyer un message JSON au serveur selon l'action choisie
-
Pour l'inscription :
{ "type": "register", "username": "alice", "password": "azerty" } -
Pour la connexion :
{ "type": "login", "username": "alice", "password": "azerty" }
-
-
Recevoir et interpréter la réponse du serveur
- Succès : afficher un message de bienvenue, puis accès à la fenêtre de tchat
- Échec : afficher l'erreur renvoyée par le serveur
-
Mettre à jour l'identité de l'utilisateur localement
- Conserver le pseudo dans un objet
CurrentUserou une variable centrale
- Conserver le pseudo dans un objet
- Les messages JSON doivent être conformes au protocole
- La fenêtre de connexion doit être fonctionnelle
- Le passage entre fenêtres doit être fluide (pas de redémarrage complet)
- Masquer le mot de passe dans le champ
JPasswordField - Ajouter une icône de chargement pendant la tentative de connexion
- Mémoriser le dernier pseudo utilisé
- Fenêtre Swing d'inscription/connexion
- Envoi des identifiants via socket
- Affichage des erreurs ou du succès
- Démarrage du tchat une fois connecté
- Comprendre comment les utilisateurs sont identifiés et suivis par le serveur.
- Récupérer la liste des utilisateurs connectés à tout moment (via les messages de statut).
- Afficher dynamiquement cette liste dans l'interface utilisateur (Swing).
- Permettre d'envoyer un message privé à un utilisateur précis.
- Distinguer visuellement les messages globaux des messages privés.
-
Créer un composant
JList<String>(ouJTable) dans votre UI. -
Dans le thread de réception, intercepter les messages de type
"status":{ "type": "status", "user": "bob", "state": "online" } -
Maintenir une
HashMap<String, String>(pseudo → statut) pour savoir qui est connecté. -
Mettre à jour dynamiquement la liste affichée.
-
Lorsqu'un utilisateur est sélectionné dans la liste, permettre d'envoyer un message uniquement à cette personne.
-
Adapter le message JSON à envoyer :
{ "type": "message", "subtype": "private", "to": "pseudo_destinataire", "content": "Message confidentiel" } -
Créer un champ d'envoi ou un bouton qui prend en compte le pseudo sélectionné.
-
Lorsque vous recevez un message :
{ "type": "message", "subtype": "private", "from": "alice", "content": "yo" } -
Afficher les MP avec un préfixe visuel clair (ex :
**[MP de Alice]** yoou fond coloré). -
Les messages globaux doivent conserver leur affichage habituel.
- Dans la classe
Message, ajouter un attributsubtypesi ce n'est pas encore fait. - Ajouter un attribut
to: le destinataire si MP, ou "global" sinon. - Dans l'affichage, utiliser
subtypepour distinguer les types de messages.
- L'interface Swing doit inclure une liste déroulante ou cliquable des utilisateurs connectés.
- Il doit être possible de choisir entre un message global et un MP.
- Le traitement des messages reçus doit être correct selon le
subtype. - Les messages privés ne doivent pas être visibles par les autres utilisateurs.
- Mettre les messages privés dans un panneau ou un onglet à part.
- Créer des canaux de discussion dynamiques (ex : par groupe ou projet).
- Ajout d'une couleur ou icône personnalisée pour chaque utilisateur connecté.
- Notification sonore ou visuelle pour les nouveaux MP.
- Une interface Swing avec affichage de la liste des utilisateurs connectés.
- Fonctionnalité d'envoi de messages privés fonctionnelle.
- Affichage clair des messages selon leur nature (global ou privé).
- Permettre aux utilisateurs de choisir leur statut (disponible, absent, invisible).
- Envoyer ce statut au serveur et l'afficher dans la liste des connectés.
- Améliorer l'affichage graphique de l'application (interface Swing).
- Vérifier toutes les fonctionnalités du projet et corriger les bugs.
- Préparer les livrables techniques pour finaliser la réalisation professionnelle.
-
Ajouter un menu déroulant (
JComboBox) ou un bouton avec options pour choisir son statut. -
Envoyer un message JSON au serveur dès que le statut est changé :
{ "type": "status", "state": "invisible" } -
Mettre à jour l'affichage des autres utilisateurs dans la liste connectée : afficher leur statut en texte ou icône (ex : point vert, gris, orange).
- Vérifier que tous les composants sont alignés et lisibles.
- Ajouter des bordures, marges, icônes ou couleurs pour améliorer l'expérience utilisateur.
- Gérer la redimension du composant et la réactivité de l'application.
- Tester les interactions entre clients (serveurs différents si besoin).
- Vérifier les cas limites : déconnexion, reconnexion, mauvais identifiants, envoi vide, etc.
- Corriger les bugs restants.
-
Préparer une documentation claire comprenant :
- Description du projet
- Architecture du code (MVC)
- Capture d’écran de l’application
- Fichier
README.mddans le projet avec les instructions de lancement - Commentaires dans le code source si ce n'est pas déjà fait
- Application complète, testée, stable et fonctionnelle
- Interface Swing finale intégrant la gestion des statuts
- Dossier de documentation (PDF ou README + captures)
- Projet Maven archivable (zip ou Git)
Pour valider le bon fonctionnement de votre application ClassCord, vous devez procéder à une démonstration opérationnelle de bout en bout. Voici le protocole recommandé :
-
Lancer le serveur (local ou celui d’un binôme SISR).
-
Lancer un premier client (avec compte ou en mode invité).
-
Lancer un second client sur une autre instance (autre IP ou autre port si besoin).
-
Effectuer les actions suivantes devant le formateur :
- Connexion avec identifiant OU en tant qu'invité
- Envoi d'un message global
- Envoi d'un message privé à un autre client
- Changement de statut et propagation visible (ex : en ligne > invisible)
- Affichage dynamique de la liste des connectés avec statut
- Bonne distinction entre message global et MP
- Aucune erreur lors de la déconnexion
| Catégorie | Idée de bonus | Description |
|---|---|---|
| UI / UX | Passage à JavaFX | Interface plus moderne avec transitions, onglets, effets visuels |
| Thèmes personnalisables | Choix entre mode clair/sombre ou autre thème | |
| Notifications / sons | Popup ou son lors de nouveaux messages (globaux ou MP) | |
| Multi-fenêtres MP | Ouverture de fenêtre dédiée pour chaque discussion privée | |
| Fonctionnel | Création de canaux | Permet de rejoindre un groupe thématique (ex : #SISR, #jeu-video) |
| Rôles spéciaux (admin, modo) | Un modérateur peut supprimer des messages, expulser un utilisateur, envoyer un message système | |
| Historique local | Enregistrement des discussions dans un fichier texte ou base locale | |
| Statuts personnalisés | Message d’humeur, lien, emoji... | |
| Technique | Intégration WebSocket client | Utilisation d’un client WebSocket au lieu de socket brut |
| Version Web (HTML/JS) | Interface web avec fetch ou WebSocket, connectée au serveur Java | |
| Export logs JSON | Sauvegarde automatique des messages ou activités sous forme de fichier JSON | |
| Interopérabilité | Compatibilité avec plusieurs serveurs | Capacité à se connecter à différents serveurs du réseau et changer dynamiquement l'adresse cible |
| Accessibilité | Navigation clavier / raccourcis | Utilisation des flèches, tabulation, raccourcis pour les commandes principales |
N’hésitez pas à innover et à aller au-delà du cahier des charges si le temps le permet : tout ajout utile, stable, pertinent sera valorisé !
A condition d'avoir tout très bien réalisé, voici a maxima les compétences que vous pouvez définir comme couvertes par le projet.
| Bloc de compétences | Référence | Intitulé |
|---|---|---|
| Concevoir et développer une solution applicative | ||
| ✔ | Analyser un besoin exprimé et son contexte juridique | |
| ✔ | Participer à la conception de l’architecture d’une solution applicative | |
| ✔ | Modéliser une solution applicative | |
| ✔ | Identifier, développer, utiliser ou adapter des composants logiciels | |
| ✔ | Utiliser des composants d’accès aux données | |
| ✔ | Réaliser les tests nécessaires à la validation ou à la mise en production | |
| ✔ | Rédiger des documentations technique et d’utilisation d’une solution applicative | |
| ✔ | Exploiter les fonctionnalités d’un environnement de développement et de tests | |
| Assurer la maintenance corrective ou évolutive d’une solution applicative | ||
| ✔ | Recueillir, analyser et mettre à jour les informations sur une version d’une application | |
| ✔ | Évaluer la qualité d’une solution applicative | |
| ✔ | Analyser et corriger un dysfonctionnement | |
| ✔ | Mettre à jour des documentations technique et d’utilisation d’une solution applicative | |
| Gérer les données | ||
| ✔ | Développer des fonctionnalités applicatives au sein d’un système de gestion de base de données | |
| ✔ | Concevoir ou adapter une base de données | |
| ✔ | Administrer et déployer une base de données |