diff --git a/POO/src/communication/Communication.java b/POO/src/communication/Communication.java index 9924723..2d4d82f 100644 --- a/POO/src/communication/Communication.java +++ b/POO/src/communication/Communication.java @@ -1,5 +1,6 @@ package communication; +import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; @@ -39,35 +40,20 @@ public class Communication extends Thread{ return -1; } - //TODO - //Combiner add et change - protected static synchronized void addUser(List datas) throws UnknownHostException { + protected static synchronized void addUser(String idClient, String pseudoClient, InetAddress ipClient) throws UnknownHostException { + Communication.users.add(new Utilisateur(idClient, pseudoClient, ipClient)); + /*VueStandard.userList.addElement(pseudoClient);*/ + } + + protected static synchronized void changePseudoUser(String idClient, String pseudoClient, InetAddress ipClient) { + int index = Communication.getIndexFromID(idClient); + Communication.users.get(index).setPseudo(pseudoClient); + /*VueStandard.userList.set(index, pseudoClient);*/ + } - String idClient = datas.get(0); - String pseudoClient = datas.get(1); - String clientAddress = datas.get(2); - - if (!Communication.containsUserFromID(idClient)) { - Communication.users.add(new Utilisateur(idClient, pseudoClient, clientAddress)); - /*VueStandard.userList.addElement(pseudoClient);*/ - } - } - protected static synchronized void changePseudoUser(List datas) { - String idClient = datas.get(0); - String pseudoClient = datas.get(1); + protected static synchronized void removeUser(String idClient, String pseudoClient, InetAddress ipClient) { int index = Communication.getIndexFromID(idClient); - System.out.println(index); - if(index != -1) { - Communication.users.get(index).setPseudo(pseudoClient); - /*VueStandard.userList.set(index, pseudoClient);*/ - } - } - - protected static synchronized void removeUser(List datas) { - String idClient = datas.get(0); - int index = Communication.getIndexFromID(idClient); - System.out.println(index); if( index != -1) { Communication.users.remove(index); /*VueStandard.userList.remove(index);*/ diff --git a/POO/src/communication/CommunicationUDP.java b/POO/src/communication/CommunicationUDP.java index fb782b0..4736e63 100644 --- a/POO/src/communication/CommunicationUDP.java +++ b/POO/src/communication/CommunicationUDP.java @@ -7,6 +7,8 @@ import java.util.ArrayList; import java.util.Arrays; import main.Utilisateur; +import messages.*; + public class CommunicationUDP extends Communication { @@ -36,64 +38,53 @@ public class CommunicationUDP extends Communication { public void sendMessageConnecte() throws UnknownHostException, IOException { for(int port : this.portOthers) { - this.client.sendMessageUDP_local("first_connection", port, InetAddress.getLocalHost()); + try { + this.client.sendMessageUDP_local(new MessageSysteme(Message.TypeMessage.JE_SUIS_CONNECTE), port, InetAddress.getLocalHost()); + } catch (MauvaisTypeMessageException e) {/*Si ça marche pas essayer là*/} } } // Send the message "add,id,pseudo" to localhost on all the ports in // "portOthers" - // This allows the receivers' agent (portOthers) to create an entry with the + // This allows the receivers' agent (portOthers) to create or modify an entry with the // data of this agent - public void sendMessageAdd() throws UnknownHostException, IOException { - this.sendIDPseudo_local("add"); + //Typically used to notify of a name change + public void sendMessageInfoPseudo() throws UnknownHostException, IOException { + Utilisateur self = Utilisateur.getSelf(); + for(int port : this.portOthers) { + try { + String pseudoSelf =self.getPseudo(); + String idSelf = self.getId(); + Message msout = new MessageSysteme(Message.TypeMessage.INFO_PSEUDO, pseudoSelf, idSelf); + this.client.sendMessageUDP_local(msout, port, InetAddress.getLocalHost()); + } catch (Exception e) {e.printStackTrace();} + } + } + + //Same, but on only one port + //Typically used to give your current name and id to a newly arrived host + public void sendMessageInfoPseudo(int portOther) throws UnknownHostException, IOException { + Utilisateur self = Utilisateur.getSelf(); + try { + this.client.sendMessageUDP_local(new MessageSysteme(Message.TypeMessage.INFO_PSEUDO, self.getPseudo(), self.getId()), portOther, InetAddress.getLocalHost()); + } catch (MauvaisTypeMessageException e) {/*Si ça marche pas essayer là*/} } - public void sendMessageAdd(ArrayList portServers) throws UnknownHostException, IOException { - this.sendIDPseudo_local("add", portServers); - } - - // Send the message "modify,id,pseudo" to localhost on all the ports in - // "portOthers" - // This allows the receivers' agent (portOthers) to update the entry - // corresponding to this agent - public void sendMessageModify() throws UnknownHostException, IOException { - this.sendIDPseudo_local("modify"); - } // Send the message "del,id,pseudo" to localhost on all the ports in // "portOthers" // This allows the receivers' agent (portOthers) to delete the entry // corresponding to this agent public void sendMessageDelete() throws UnknownHostException, IOException { - this.sendIDPseudo_local("del"); - } - - // Private function to create the message "[prefix],id,pseudo" - // and send it to localhost on all the ports in "portOthers" - private void sendIDPseudo_local(String prefixe, ArrayList portServers) throws UnknownHostException, IOException { - Utilisateur self = Utilisateur.getSelf(); - String idSelf = self.getId(); - String pseudoSelf = self.getPseudo(); - - if (!pseudoSelf.equals("")) { - - String message = prefixe + "," + idSelf + "," + pseudoSelf; - // A modifier pour créer un objet de type Message - // - // - - for (int port : portServers) { - this.client.sendMessageUDP_local(message, port, InetAddress.getLocalHost()); - } + for(int port : this.portOthers) { + try { + this.client.sendMessageUDP_local(new MessageSysteme(Message.TypeMessage.JE_SUIS_DECONNECTE), port, InetAddress.getLocalHost()); + } catch (MauvaisTypeMessageException e) {/*Si ça marche pas essayer là*/} } - - } - - private void sendIDPseudo_local(String prefixe) throws UnknownHostException, IOException { - this.sendIDPseudo_local(prefixe, this.portOthers); } + //Pas encore adapte message // private void sendIDPseudo_broadcast(String prefixe) throws UnknownHostException, IOException { // Utilisateur self = Utilisateur.getSelf(); // String idSelf = self.getId(); diff --git a/POO/src/communication/UDPServer.java b/POO/src/communication/UDPServer.java index f91b693..936051a 100644 --- a/POO/src/communication/UDPServer.java +++ b/POO/src/communication/UDPServer.java @@ -7,6 +7,8 @@ import java.net.SocketException; import java.util.ArrayList; import java.util.Arrays; +import messages.*; + public class UDPServer extends Thread { @@ -28,50 +30,38 @@ public class UDPServer extends Thread { try { DatagramPacket inPacket = new DatagramPacket(buffer, buffer.length); this.sockUDP.receive(inPacket); - String msg = new String(inPacket.getData(), 0, inPacket.getLength()); + String msgString = new String(inPacket.getData(), 0, inPacket.getLength()); + Message msg = Message.stringToMessage(msgString); - if (msg.equals("first_connection")) { + switch(msg.getTypeMessage()) { + case JE_SUIS_CONNECTE : //System.out.println("first co"); - ArrayList portClient = new ArrayList(); - portClient.add(inPacket.getPort()+1); - this.commUDP.sendMessageAdd(portClient); + int portServer = inPacket.getPort(); + int portClient = portServer+1; + this.commUDP.sendMessageInfoPseudo(portServer); + break; - } else if (msg.contains("add,")) { - //System.out.println("add"); - ArrayList datas = this.getDatas(inPacket); - Communication.addUser(datas); + case INFO_PSEUDO : + if (Communication.containsUserFromID(((MessageSysteme) msg).getId())) { + Communication.changePseudoUser(((MessageSysteme) msg).getId(), ((MessageSysteme) msg).getPseudo(), inPacket.getAddress()); + } + else { + Communication.addUser(((MessageSysteme) msg).getId(), ((MessageSysteme) msg).getPseudo(), inPacket.getAddress()); + System.out.println(((MessageSysteme) msg).getId()+", "+((MessageSysteme) msg).getPseudo()); + } + break; - } else if (msg.contains("modify,")) { - ArrayList datas = this.getDatas(inPacket); - Communication.changePseudoUser(datas); + case JE_SUIS_DECONNECTE : + Communication.removeUser(((MessageSysteme) msg).getId(), ((MessageSysteme) msg).getPseudo(), inPacket.getAddress()); + break; - } else if (msg.contains("del,")) { - ArrayList datas = this.getDatas(inPacket); - Communication.removeUser(datas); + default : //Others types of messages are ignored because they are supposed to be transmitted by TCP and not UDP } } catch (IOException e) { System.out.println("receive exception"); - } } } - - protected ArrayList getDatas(DatagramPacket inPacket) { - //Message - // - - String msg = new String(inPacket.getData(), 0, inPacket.getLength()); - String tmp[] = msg.split(","); - - - - ArrayList datas = new ArrayList(Arrays.asList(tmp)); - datas.remove(0); - datas.add(inPacket.getAddress().toString()); - - return datas; - } - } diff --git a/POO/src/main/ControleurConnexion.java b/POO/src/main/ControleurConnexion.java index 695b62b..38deccd 100644 --- a/POO/src/main/ControleurConnexion.java +++ b/POO/src/main/ControleurConnexion.java @@ -2,6 +2,10 @@ package main; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.IOException; +import java.net.UnknownHostException; + +import communication.*; public class ControleurConnexion implements ActionListener { @@ -9,26 +13,51 @@ public class ControleurConnexion implements ActionListener { private VueConnexion vue; private Etat etat; + private CommunicationUDP comUDP; + private String id; + private String pseudo; public ControleurConnexion(VueConnexion vue) { this.vue = vue; this.etat = Etat.DEBUT; + this.id=""; + //Pour les tests, changer pour un truc plus général quand on change CommunicationUDP + try { + this.comUDP = new CommunicationUDP(2209, 2208, new int[] {2905}); + } catch (IOException e) { + e.printStackTrace(); + } } @Override public void actionPerformed(ActionEvent e) { - String input; boolean inputOK = false; if (this.etat == Etat.DEBUT) { - input=vue.getValeurTextField(); + id=vue.getValeurTextField(); //Recherche dans la liste des utilisateurs enregistres, report sur inputOK - if (input.contentEquals("idvalide")) inputOK=true; + inputOK = id.contentEquals("idvalide"); if (inputOK) { this.etat=Etat.ID_OK; //Envoi broadcast du message "JeSuisActif" et, attente du retour de la liste des utilisateurs actifs + try { + comUDP.sendMessageConnecte(); + } catch (UnknownHostException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (IOException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + + try { + Thread.sleep(2); + } catch (InterruptedException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } //Mise en place de la demande du pseudo vue.setTexteLabelInput("Veuillez entrer votre nom"); @@ -38,14 +67,32 @@ public class ControleurConnexion implements ActionListener { else vue.setTexteLabelInput("Identifiant invalide, veuillez réessayer"); } else { - input=vue.getValeurTextField(); + pseudo=vue.getValeurTextField(); //Recherche dans la liste locale des utilisateurs connectes, report sur inputOK - if (input.contentEquals("nomvalide")) inputOK=true; + inputOK = !Communication.containsUserFromPseudo(pseudo); if (inputOK) { - //Creation de la vue principale + //Reglage de l'utilisateur + try { + Utilisateur.setSelf(id, pseudo, "localhost"); + } catch (UnknownHostException e2) { + // TODO Auto-generated catch block + e2.printStackTrace(); + } + //Broadcast du pseudo + try { + comUDP.sendMessageInfoPseudo(); + } catch (UnknownHostException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (IOException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + //Creation de la vue principale + vue.setTexteLabelInput("Congrations you done it"); } else vue.setTexteLabelInput("Ce nom est déjà utilisé, veuillez en choisir un autre"); } diff --git a/POO/src/main/Main2tests.java b/POO/src/main/Main2tests.java new file mode 100644 index 0000000..a771490 --- /dev/null +++ b/POO/src/main/Main2tests.java @@ -0,0 +1,28 @@ +package main; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; + +import communication.*; + +public class Main2tests { + + public static void main(String[] args) { + try { + Utilisateur.setSelf("idrandom", "RandomPersonne", "localhost"); + } catch (UnknownHostException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + try { + Communication comUDP = new CommunicationUDP(2906, 2905, new int[] {}); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + while (true) {} + + } +} diff --git a/POO/src/main/Utilisateur.java b/POO/src/main/Utilisateur.java index bd44e5e..caaf122 100644 --- a/POO/src/main/Utilisateur.java +++ b/POO/src/main/Utilisateur.java @@ -15,10 +15,10 @@ public class Utilisateur implements Serializable{ private static Utilisateur self; - public Utilisateur(String id, String pseudo, String host) throws UnknownHostException { + public Utilisateur(String id, String pseudo, InetAddress ip) throws UnknownHostException { this.id = id; this.pseudo = pseudo; - this.ip = InetAddress.getLocalHost(); + this.ip = ip; System.out.println(InetAddress.getLocalHost()); } @@ -41,9 +41,8 @@ public class Utilisateur implements Serializable{ public static void setSelf(String id, String pseudo,String host) throws UnknownHostException { if(Utilisateur.self == null) { - Utilisateur.self = new Utilisateur(id, pseudo, host); + Utilisateur.self = new Utilisateur(id, pseudo, InetAddress.getByName(host)); } - } public static Utilisateur getSelf() { diff --git a/POO/src/messages/Message.java b/POO/src/messages/Message.java index 31457f5..4afae87 100644 --- a/POO/src/messages/Message.java +++ b/POO/src/messages/Message.java @@ -34,7 +34,7 @@ public abstract class Message implements Serializable { return new MessageSysteme(TypeMessage.JE_SUIS_DECONNECTE); case "INFO_PSEUDO" : - return new MessageSysteme(TypeMessage.INFO_PSEUDO, parts[1]); + return new MessageSysteme(TypeMessage.INFO_PSEUDO, parts[1], parts[2]); case "TEXTE" : return new MessageTexte(TypeMessage.TEXTE, parts[1]); @@ -53,7 +53,7 @@ public abstract class Message implements Serializable { public static void main(String[] args) throws MauvaisTypeMessageException { Message m1 = new MessageSysteme(TypeMessage.JE_SUIS_CONNECTE); Message m2 = new MessageSysteme(TypeMessage.JE_SUIS_DECONNECTE); - Message m3 = new MessageSysteme(TypeMessage.INFO_PSEUDO, "pseudo156434518"); + Message m3 = new MessageSysteme(TypeMessage.INFO_PSEUDO, "pseudo156434518", "id236"); Message m4 = new MessageTexte(TypeMessage.TEXTE, "blablabla"); Message m5 = new MessageFichier(TypeMessage.FICHIER, "truc", ".pdf"); diff --git a/POO/src/messages/MessageSysteme.java b/POO/src/messages/MessageSysteme.java index 4210024..dcda974 100644 --- a/POO/src/messages/MessageSysteme.java +++ b/POO/src/messages/MessageSysteme.java @@ -4,19 +4,22 @@ public class MessageSysteme extends Message { private static final long serialVersionUID = 1L; private String pseudo; + private String id; public MessageSysteme(TypeMessage type) throws MauvaisTypeMessageException{ if ((type==TypeMessage.JE_SUIS_CONNECTE)||(type==TypeMessage.JE_SUIS_DECONNECTE)||(type==TypeMessage.MESSAGE_NUL)) { this.type=type; this.pseudo=""; + this.id=""; } else throw new MauvaisTypeMessageException(); } - public MessageSysteme(TypeMessage type, String pseudo) throws MauvaisTypeMessageException { + public MessageSysteme(TypeMessage type, String pseudo, String id) throws MauvaisTypeMessageException { if (type==TypeMessage.INFO_PSEUDO) { this.type=type; this.pseudo=pseudo; + this.id=id; } else throw new MauvaisTypeMessageException(); } @@ -24,9 +27,13 @@ public class MessageSysteme extends Message { public String getPseudo() { return this.pseudo; } + + public String getId() { + return this.id; + } @Override protected String attributsToString() { - return this.pseudo; + return this.pseudo+"###"+this.id; } }