diff --git a/.idea/workspace.xml b/.idea/workspace.xml index ed49456..8080c58 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,27 +2,13 @@ - - + - - - - - - - - - - - - - - + - - - - - + - - - - - - - - - + @@ -282,7 +138,8 @@ - + + diff --git a/README.md b/README.md index 4be1df6..d96be0f 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,22 @@ -# Question 6 +

Projet Mini Chat

+

+ Version +

-## Avant la communication -Utiliser le RSA, avant toute communication. -Le client et le server génèrent 2 clés (une publique et une privées) -Ils s'échangent leurs clé publiques. +> Projet de réseau, semestre 5 Licence Informatique 2022-2023 à l'INU Champollion. -![img](https://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Asymmetric_cryptography_-_step_1.svg/800px-Asymmetric_cryptography_-_step_1.svg.png) +## Auteurs -## Pendant la communication -Lors qu'un utilisateur veut envoyer un message, il crypte son -message avec la clé pulique de son interlocuteur et lui envoie. -La personne qui reçois le message, le décrypte le message avec -sa propre clé privée. +👤 **Gaël BURGUÈS** -![img](https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Asymmetric_cryptography_-_step_2.svg/800px-Asymmetric_cryptography_-_step_2.svg.png) \ No newline at end of file +* Github: [@Gagl08](https://github.com/Gagl08) + +👤 **Laurian DUFRECHOU** + +* Github: [@Laurian-Dufrechou](https://github.com/Laurian-Dufrechou) + +👤 **Lucàs VABRE** + +* Github: [@LucasVbr](https://github.com/LucasVbr) + +*** \ No newline at end of file diff --git a/src/client/Client.java b/src/client/Client.java index 424d944..621f60f 100644 --- a/src/client/Client.java +++ b/src/client/Client.java @@ -31,24 +31,64 @@ import java.util.Scanner; * @author Lucàs Vabre */ -public class Client extends Thread{ +public class Client extends Thread { - //elements d'un client + /** + * Adresse IP de connexion au serveur + */ private final String SERVER_IP; + + /** + * Port de connexion du serveur + */ private final int SERVER_PORT; + + /** + * Interface utilisateur + */ private final FenetreClient fenetre; + + /** + * Le pseudonyme du client + */ private String pseudo; - private KeyPair clientKeys; + + /** + * Paire de clés de chiffrage du client + */ + private final KeyPair clientKeys; + + /** + * Clé publique du serveur + */ private PublicKey serverKey; + /** + * Flux d'entrée pour la version console + */ private final Scanner scanner; - // Sockets de connexion + /** + * Flux d'entrée du socket + */ private ObjectInputStream inputStream; + + /** + * Flux de sortie du socket + */ private ObjectOutputStream outputStream; - private ArrayList fileAttenteMessage; + /** + * File d'attente des messages à envoyer + */ + private final ArrayList fileAttenteMessage; + /** + * Crée un nouveau client qui se connecte à un serveur + * + * @param ip Adresse du serveur (IP ou URI) + * @param port Port de connexion + */ public Client(String ip, int port) { this.SERVER_IP = ResolutionDeNom.getIPAddress(ip); this.SERVER_PORT = port; @@ -62,10 +102,11 @@ public class Client extends Thread{ } /** - * ancien object client sans fenetre - * @param ip adresse ip du client - * @param port numeros de port du client - * @param pseudo pseudo du client + * Crée un nouveau client qui se connecte à un serveur avec un pseudo + * + * @param ip Adresse du serveur (IP ou URI) + * @param port Port de connexion + * @param pseudo Le pseudo du client */ public Client(String ip, int port, String pseudo) { this.SERVER_IP = ResolutionDeNom.getIPAddress(ip); @@ -80,11 +121,12 @@ public class Client extends Thread{ } /** - * Object client actuel - * @param ip adresse ip du client - * @param port numeros de port du client - * @param pseudo nom du client - * @param fenetre fenetreClient assicié au client + * Crée un nouveau client lié à une interface utilisateur + * + * @param ip Adresse du serveur (IP ou URI) + * @param port Port de connexion au serveur + * @param pseudo Pseudonyme du client + * @param fenetre Interface du client */ public Client(String ip, int port, String pseudo, FenetreClient fenetre) { this.SERVER_IP = ResolutionDeNom.getIPAddress(ip); @@ -100,26 +142,30 @@ public class Client extends Thread{ @Override public void run() { + // Demande la saisie du pseudo s'il n'est pas défini if (pseudo == null) { System.out.print("Pseudo: "); pseudo = scanner.nextLine(); } + // Connexion au socket try (Socket socket = new Socket(SERVER_IP, SERVER_PORT)) { inputStream = new ObjectInputStream(socket.getInputStream()); outputStream = new ObjectOutputStream(socket.getOutputStream()); + // Initialisation : envoi des clés et du pseudo exchangeKeys(); sendMessage(pseudo); - // Ecoute du serveur + // Écoute du serveur ListenThread threadClient = new ListenThread(this, fenetre); threadClient.start(); - // Ecoute de l'entrée du clavier + // Écoute de l'entrée du clavier System.out.println("Tapez 'bye' pour quitter\n"); String message = ""; do { + // S'il y a un message dans la file d'attente, on l'envoie if (fileAttenteMessage.size() > 0) { message = fileAttenteMessage.remove(0); sendMessage(message); @@ -127,14 +173,15 @@ public class Client extends Thread{ } while (!Objects.equals(message, "bye")); } catch (ConnectException e) { - System.err.println("Serveur non trouvé"); // TODO throw error - if (fenetre != null) { + System.err.println("Serveur non trouvé"); + + if (fenetre != null) { // Affiche l'erreur sur l'interface utilisateur new FenetreErreur("Serveur non trouvé", fenetre); fenetre.deconnexion(); } } catch (EOFException e) { - System.err.println("Connexion perdue"); // TODO throw error - if (fenetre != null) { + System.err.println("Connexion perdue"); + if (fenetre != null) { // Affiche l'erreur sur l'interface utilisateur new FenetreErreur("Connexion perdue", fenetre); fenetre.deconnexion(); } @@ -144,11 +191,12 @@ public class Client extends Thread{ } /** - * envoie la clef client au serveur - * @throws IOException - * @throws ClassNotFoundException + * Échange les clés publiques du client et du serveur + * + * @throws IOException Erreur de connexion + * @throws ClassNotFoundException L'objet reçu n'a pas pu être cast en PublicKey */ - public void exchangeKeys() throws IOException, ClassNotFoundException { + private void exchangeKeys() throws IOException, ClassNotFoundException { // Envoie sa clé outputStream.writeObject(clientKeys.getPublic()); @@ -157,9 +205,10 @@ public class Client extends Thread{ } /** - * envoie un message dans la socket - * @param message message a envoyer au serveur - * @throws IOException + * Envoie un message au serveur + * + * @param message Le message à envoyer + * @throws IOException Erreur de connexion au socket */ public void sendMessage(String message) throws IOException { byte[] messageCrypte = RSA.encrypter(message, serverKey); @@ -167,10 +216,11 @@ public class Client extends Thread{ } /** - * Recupere un message evoye par le serveur - * @return - * @throws IOException - * @throws ClassNotFoundException + * Récupère un message du serveur + * + * @return Le message reçu + * @throws IOException Erreur de connexion au serveur + * @throws ClassNotFoundException L'objet reçu n'a pas pu être cast en byte[] */ public String getMessage() throws IOException, ClassNotFoundException { byte[] messageCrypte = (byte[]) inputStream.readObject(); @@ -178,8 +228,9 @@ public class Client extends Thread{ } /** - * Ajoute un message à la file d'attente - * @param message messsage a ajouter a la file + * Ajoute un message dans la file d'attente des messages à envoyer + * + * @param message Le message à envoyer */ public void addMessage(String message) { this.fileAttenteMessage.add(message); diff --git a/src/client/ListenThread.java b/src/client/ListenThread.java index 1c3ed25..031345a 100644 --- a/src/client/ListenThread.java +++ b/src/client/ListenThread.java @@ -22,10 +22,14 @@ import java.net.SocketException; */ public class ListenThread extends Thread { - /** Instance du client */ + /** + * Instance du client + */ private final Client client; - /** Interface utilisateur du client */ + /** + * Interface utilisateur du client + */ private final FenetreClient fenetre; /** @@ -39,10 +43,10 @@ public class ListenThread extends Thread { } /** - * Object d'ecoute avec fenetre + * Crée un nouveau thread lorsque le client utilise une interface utilisateur * - * @param client client associe à l'ecoute - * @param fenetre fenetreClient associe à l'ecoute + * @param client client associe à l'écoute + * @param fenetre Interface utilisateur du client */ public ListenThread(Client client, FenetreClient fenetre) { this.client = client; @@ -56,16 +60,16 @@ public class ListenThread extends Thread { String message; while (true) { message = client.getMessage(); + + // Log System.out.println(message); - if (fenetre != null) { - fenetre.displayNewMessage(message); - } + if (fenetre != null) fenetre.displayNewMessage(message); } - } catch (SocketException ignored) { + } catch (SocketException ignored) { // Le socket client est fermé System.out.println("Vous avez quitté le salon"); - } catch (EOFException ignored) { + } catch (EOFException ignored) { // Fermeture coté serveur System.err.println("Connexion perdue"); - if (fenetre != null) { + if (fenetre != null) { // Affiche une erreur sur l'interface utilisateur new FenetreErreur("Connexion perdue", fenetre); fenetre.deconnexion(); } diff --git a/src/ui/FenetreClient.java b/src/ui/FenetreClient.java index 360ba65..2626d3a 100644 --- a/src/ui/FenetreClient.java +++ b/src/ui/FenetreClient.java @@ -51,6 +51,7 @@ public class FenetreClient extends JFrame { // Au lancement, on ne peut pas envoyer de message sans être connecté au serveur messageInput.setEnabled(false); envoyerButton.setEnabled(false); + deconnexionButton.setEnabled(false); // Action des boutons messageInput.addKeyListener(new KeyAdapter() { @@ -114,10 +115,12 @@ public class FenetreClient extends JFrame { addressInput.setEnabled(false); portInput.setEnabled(false); pseudoInput.setEnabled(false); + connexionButton.setEnabled(false); // Active l'interface de tchat messageInput.setEnabled(true); envoyerButton.setEnabled(true); + deconnexionButton.setEnabled(true); } /** @@ -137,10 +140,12 @@ public class FenetreClient extends JFrame { addressInput.setEnabled(true); portInput.setEnabled(true); pseudoInput.setEnabled(true); + connexionButton.setEnabled(true); // Désactive l'interface de tchat messageInput.setEnabled(false); envoyerButton.setEnabled(false); + deconnexionButton.setEnabled(false); } /**