diff --git a/Implementation/src/ChatApp.class b/Implementation/src/ChatApp.class index 2dda9db..19b6010 100644 Binary files a/Implementation/src/ChatApp.class and b/Implementation/src/ChatApp.class differ diff --git a/Implementation/src/ChatApp.java b/Implementation/src/ChatApp.java index 81239e8..b6dbb73 100644 --- a/Implementation/src/ChatApp.java +++ b/Implementation/src/ChatApp.java @@ -36,7 +36,7 @@ public class ChatApp { } //ip.getHostAddress(); this.me = new Utilisateur(pseudo,port,ip); - this.actifUsers.add(me); + this.actifUsers.add(getMe()); } /** * Ajouter des utilisateurs actifs dans l'attribut liste 'actifUsers' @@ -46,14 +46,52 @@ public class ChatApp { public void addList(Utilisateur u) { this.actifUsers.add(u); } - + public Utilisateur getPseudoList(String pseudo) { + for(Utilisateur elem: this.actifUsers) + { + if (elem.getPseudo().equals(pseudo) ) { + return elem ; + } + } + return null ; + } /** * Supprimer de la liste des utilisateurs actifs 'actifUsers' un certain utilisateur * * @param u on va supprimer cet utilisateur dans la liste */ public void supprimerList(Utilisateur u) { - this.actifUsers.remove(u); + Boolean Sup = false ; + for(Utilisateur elem: this.actifUsers) + { + if (elem.equals(u) ) { + this.actifUsers.remove(elem); + Sup = true ; + this.afficherListeUtilisateurs(); + } + } + if (!Sup) { + System.out.println("Tentative de retirer un objet non contenu dans la liste"); + } + } + + /** + * Modifie le nom d'un utilisateur dans la liste des utilisateurs actifs 'actifUsers' + * + * @param ancien correspond au pseudo remplacer + * @param nouveau correspond au nouveau pseudo + */ + public void modifierList(String ancien , String nouveau) { + for(Utilisateur elem: this.actifUsers) + { + if (ancien.equals( elem.getPseudo() ) ) { + this.actifUsers.remove(elem); + elem.setPseudo(nouveau);; + this.addList(elem); + + } + } + this.afficherListeUtilisateurs(); } /** @@ -71,6 +109,21 @@ public class ChatApp { return true; } + /** + * Modification du pseudo de l'utilisateur + * Envoie en broadcast son ancien pseudo et son nouveau + * + * @param nouveau correspond au nouveau pseudo + */ + public void modifierPseudo(String nouveau) throws IOException { + // @ de broadcast du réseau de l'utilisateur me + InetAddress broadcastAdress = InetAddress.getLoopbackAddress(); // A MODIFIER + // Message que l'on envoie à tous les utilisateurs actifs + String broadcastMessage = "Modification Pseudo\n" + this.getMe().getPseudo() + "\n" + nouveau + "\n"; + Integer port = 1234 ; + UDPEchange.connexion(broadcastAdress,broadcastMessage, port); + } + public void afficherListeUtilisateurs() { System.out.println ("Liste des utilisateurs actifs : "); for(Utilisateur elem: this.actifUsers) @@ -79,18 +132,35 @@ public class ChatApp { } } - + /** + * Methode appelée lors de la connexion d'un nouvel utilisateur. + * Il va prévenir les utilisateurs du réseau de son arrivée. + * + */ public void connexion() throws IOException { // @ de broadcast du réseau de l'utilisateur me InetAddress broadcastAdress = InetAddress.getLoopbackAddress(); // A MODIFIER // Message que l'on envoie à tous les utilisateurs actifs - String broadcastMessage = "Connexion\n" + this.me.toString() ; + String broadcastMessage = "Connexion\n" + this.getMe().toString() ; Integer port = 1234 ; UDPEchange.connexion(broadcastAdress,broadcastMessage, port); } + /** + * Methode appelée lors de la déconnexion de l'utilisateur. + * Il va prévenir les utilisateurs du réseau de son départ. + * + */ + public void deconnexion() throws IOException { + // @ de broadcast du réseau de l'utilisateur me + InetAddress broadcastAdress = InetAddress.getLoopbackAddress(); // A MODIFIER + // Message que l'on envoie à tous les utilisateurs actifs + String broadcastMessage = "Deconnexion\n" + this.getMe().toString() ; + Integer port = 1234 ; + UDPEchange.connexion(broadcastAdress,broadcastMessage, port); + } - public static void main (String[] args) { + public static void main (String[] args) throws IOException { //Integer p = 2345 ; ChatApp app = new ChatApp(args[0],Integer.parseInt(args[1])) ; @@ -100,7 +170,30 @@ public class ChatApp { e.printStackTrace(); } ExecutorService exec = Executors.newFixedThreadPool(1000); - exec.submit(new Runner(app)); + exec.submit(new Runner(app)); + if (app.getMe().getPort() == 4000) { + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + app.modifierPseudo("Jean"); + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + app.modifierPseudo("Eliot"); + /*try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + app.deconnexion(); */ + } + } + public Utilisateur getMe() { + return me; } } @@ -111,7 +204,9 @@ class Runner implements Runnable { } @Override public void run() { + if (app.getMe().getPort() != 4000) { UDPEchange.ecouteUDP(app); + } } } diff --git a/Implementation/src/Runner.class b/Implementation/src/Runner.class index 7f2cbdd..a7108d5 100644 Binary files a/Implementation/src/Runner.class and b/Implementation/src/Runner.class differ diff --git a/Implementation/src/RunnerUDP.class b/Implementation/src/RunnerUDP.class index c461688..87f0a36 100644 Binary files a/Implementation/src/RunnerUDP.class and b/Implementation/src/RunnerUDP.class differ diff --git a/Implementation/src/UDPEchange.class b/Implementation/src/UDPEchange.class index 72b05d2..6643f06 100644 Binary files a/Implementation/src/UDPEchange.class and b/Implementation/src/UDPEchange.class differ diff --git a/Implementation/src/UDPEchange.java b/Implementation/src/UDPEchange.java index 4dbf208..f572c76 100644 --- a/Implementation/src/UDPEchange.java +++ b/Implementation/src/UDPEchange.java @@ -64,7 +64,17 @@ public class UDPEchange { } // Un thread est lancé à chaque reception d'un message exec.submit(new RunnerUDP(data,app)); - } + } + } + + public static void envoiUnicast( InetAddress broadcastAdress , String broadcastMessage , Integer port) throws IOException { + // Envoie en broadcast à tous les utilsateurs + DatagramSocket socket = new DatagramSocket(); + byte[]buffer = broadcastMessage.getBytes(); + DatagramPacket packet = new DatagramPacket( buffer, buffer.length, InetAddress.getLoopbackAddress(), port ); + socket.send(packet); + socket.close(); + System.out.println(broadcastMessage); } } @@ -97,18 +107,64 @@ class RunnerUDP implements Runnable { System.out.println(received); String Type = received.split("\n")[0]; if (Type.equals("Connexion")) { // un utilisateur vient d'arriver sur le reseau - app.addList(Utilisateur.stringToUtilisateur(received.split("\n")[1])); + System.out.println("Reception d'une demande de connexion"); + Utilisateur u = Utilisateur.stringToUtilisateur(received.split("\n")[1]); + String reponse = "Reponse Connexion\n"; + if (!app.verifierUnicite(u.getPseudo())) { + System.out.println("Pseudo deja present dans la liste"); + reponse += "false\n"; + } + else { + System.out.println("Ajout d'un nouvel utilisateur dans la liste des Utilisateurs"); + app.addList(u); + reponse += "true\n"; + + } + reponse += app.getMe().toString(); + try { + UDPEchange.envoiUnicast(u.getIp(),reponse,u.getPort()); + }catch(IOException e) + { + System.out.println("Echec de l'envoi du message"); + } + app.afficherListeUtilisateurs(); } if (Type.equals("Reponse Connexion")) { // Un utilisateur te repond suite à ta demande de connexion app.afficherListeUtilisateurs(); } if (Type.equals("Modification Pseudo")) { + if(app.verifierUnicite(received.split("\n")[2])) { + app.modifierList(received.split("\n")[1],received.split("\n")[2]); + Utilisateur Destination = app.getPseudoList(received.split("\n")[1]); + String Message = "Bon Choix Pseudo\n" + received.split("\n")[2] ; + try { + UDPEchange.envoiUnicast(Destination.getIp(),Message, 1234); + } catch (IOException e) { + e.printStackTrace(); + } + } + else { + Utilisateur Destination = app.getPseudoList(received.split("\n")[1]); + String Message = "Mauvais Choix Pseudo\n" ; + try { + UDPEchange.envoiUnicast(Destination.getIp(),Message, 1234); + } catch (IOException e) { + e.printStackTrace(); + } + } app.afficherListeUtilisateurs(); } + if (Type.equals("Mauvais Choix Pseudo")) { + System.out.println("Ce choix de pseudo est déjà pris il te faut en choisir un autre"); + } + if (Type.equals("Bon Choix Pseudo")) { + app.supprimerList(app.getMe()); + app.getMe().setPseudo(received.split("\n")[1]); + app.addList(app.getMe()); + } if (Type.equals("Deconnexion")) { app.supprimerList(Utilisateur.stringToUtilisateur(received.split("\n")[1])); - app.afficherListeUtilisateurs(); } } } diff --git a/Implementation/src/Utilisateur.class b/Implementation/src/Utilisateur.class index 7c4a8d1..958fe6a 100644 Binary files a/Implementation/src/Utilisateur.class and b/Implementation/src/Utilisateur.class differ diff --git a/Implementation/src/Utilisateur.java b/Implementation/src/Utilisateur.java index 4fd57e7..de29299 100644 --- a/Implementation/src/Utilisateur.java +++ b/Implementation/src/Utilisateur.java @@ -1,7 +1,7 @@ import java.net.InetAddress; import java.net.UnknownHostException; -public class Utilisateur { +public class Utilisateur extends Object { private String pseudo ; private Integer port; @@ -40,7 +40,7 @@ public class Utilisateur { return s; } - public static Utilisateur stringToUtilisateur(String s){ + public static Utilisateur stringToUtilisateur(String s) { String name = ""; Integer port = 0; String ip = "" ; @@ -56,5 +56,10 @@ public class Utilisateur { } return user; } + + + public Boolean equals(Utilisateur u) { + return this.getPseudo().equals( u.getPseudo() ) ; + } }