From 2d321d71035de66c2447645588e87993342c3fa7 Mon Sep 17 00:00:00 2001 From: m-gues Date: Sat, 9 Jan 2021 17:16:07 +0100 Subject: [PATCH] comUDP du servlet modifiee, attente de reponse sur HHTPServletRequest --- .../src/communication/CommunicationUDP.java | 63 ++++++++++++--- POO_Server/src/main/ServletPresence.java | 79 +++++++++++++------ POO_Server/src/messages/Message.java | 8 +- POO_Server/src/messages/MessageSysteme.java | 4 +- 4 files changed, 113 insertions(+), 41 deletions(-) diff --git a/POO_Server/src/communication/CommunicationUDP.java b/POO_Server/src/communication/CommunicationUDP.java index 2028e7d..51221c7 100644 --- a/POO_Server/src/communication/CommunicationUDP.java +++ b/POO_Server/src/communication/CommunicationUDP.java @@ -13,8 +13,6 @@ import messages.*; public class CommunicationUDP extends Thread { - // public enum Mode {PREMIERE_CONNEXION, CHANGEMENT_PSEUDO, DECONNEXION}; - private UDPClient client; private int portServer; private ArrayList portOthers; @@ -82,6 +80,15 @@ public class CommunicationUDP extends Thread { return -1; } + public Utilisateur getUserFromID(String id) { + for(Utilisateur u : users) { + if(u.getId().equals(id) ) { + return u; + } + } + return null; + } + private int getIndexFromIP(InetAddress ip) { for(int i=0; i < users.size() ; i++) { if(users.get(i).getIp().equals(ip)) { @@ -94,23 +101,37 @@ public class CommunicationUDP extends Thread { protected synchronized void addUser(String idClient, String pseudoClient, InetAddress ipClient, int port) throws IOException { users.add(new Utilisateur(idClient, pseudoClient, ipClient, port)); - observer.update(this, users); - + try { + Message message = new MessageSysteme(Message.TypeMessage.INFO_PSEUDO, idClient, pseudoClient, port); + observer.update(this, message); + } catch (MauvaisTypeMessageException e) { + e.printStackTrace(); + } } protected synchronized void changePseudoUser(String idClient, String pseudoClient, InetAddress ipClient, int port) { int index = getIndexFromID(idClient); users.get(index).setPseudo(pseudoClient); - observer.update(this, users); + try { + Message message = new MessageSysteme(Message.TypeMessage.INFO_PSEUDO, idClient, pseudoClient, port); + observer.update(this, message); + } catch (MauvaisTypeMessageException e) { + e.printStackTrace(); + } } protected synchronized void removeUser(String idClient, String pseudoClient,InetAddress ipClient, int port) { - int index = getIndexFromIP(ipClient); + int index = getIndexFromID(idClient); if( index != -1) { users.remove(index); } - observer.update(this, users); + try { + Message message = new MessageSysteme(Message.TypeMessage.JE_SUIS_DECONNECTE, idClient, pseudoClient, port); + observer.update(this, message); + } catch (MauvaisTypeMessageException e) { + e.printStackTrace(); + } } public void removeAll(){ @@ -124,7 +145,7 @@ public class CommunicationUDP extends Thread { public void sendMessageConnecte() throws UnknownHostException, IOException { for(int port : this.portOthers) { try { - this.client.sendMessageUDP_local(new MessageSysteme(Message.TypeMessage.JE_SUIS_CONNECTE), port, InetAddress.getLocalHost()); + this.client.sendMessageUDP_local(new MessageSysteme(Message.TypeMessage.JE_SUIS_CONNECTE, Utilisateur.getSelf().getId()), port, InetAddress.getLocalHost()); } catch (MauvaisTypeMessageException e) {/*Si ça marche pas essayer là*/} } } @@ -152,8 +173,6 @@ public class CommunicationUDP extends Thread { } catch (Exception e) { e.printStackTrace(); } - - } //Same, but on only one port @@ -175,10 +194,32 @@ public class CommunicationUDP extends Thread { public void sendMessageDelete() throws UnknownHostException, IOException { for(int port : this.portOthers) { try { - this.client.sendMessageUDP_local(new MessageSysteme(Message.TypeMessage.JE_SUIS_DECONNECTE), port, InetAddress.getLocalHost()); + this.client.sendMessageUDP_local(new MessageSysteme(Message.TypeMessage.JE_SUIS_DECONNECTE, Utilisateur.getSelf().getId()), port, InetAddress.getLocalHost()); } catch (MauvaisTypeMessageException e) {} } } + + //Broadcast a given message on the local network + public void sendMessage(Message m) { + try { + for(int port : this.portOthers) { + this.client.sendMessageUDP_local(m, port, InetAddress.getLocalHost()); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + //Send a given message to a specific user (here, by port) + public void sendMessage(Message m, int port) { + try { + this.client.sendMessageUDP_local(m, port, InetAddress.getLocalHost()); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } //Pas encore adapte message // private void sendIDPseudo_broadcast(String prefixe) throws UnknownHostException, IOException { diff --git a/POO_Server/src/main/ServletPresence.java b/POO_Server/src/main/ServletPresence.java index e20a3bb..05e6b61 100644 --- a/POO_Server/src/main/ServletPresence.java +++ b/POO_Server/src/main/ServletPresence.java @@ -1,6 +1,7 @@ package main; import java.io.IOException; +import java.net.InetAddress; import java.util.ArrayList; import javax.servlet.ServletException; @@ -10,6 +11,8 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import communication.CommunicationUDP; +import messages.*; +import messages.Message.TypeMessage; /** * Servlet implementation class ServletPresence @@ -17,12 +20,9 @@ import communication.CommunicationUDP; @WebServlet("/ServletPresence") public class ServletPresence extends HttpServlet implements Observer { private static final long serialVersionUID = 1L; - - //suscribe(), publish(), snotify(), puis voir doPost - //Voir avant tout le fonctionnement des requetes HTTP, et comment elles donnent des infos - //rajouter une classe pour la communication HTTP <= tenir Kevin au courant private CommunicationUDP comUDP; + private ArrayList remoteUsers; public ServletPresence() { //A changer en passant aux IP @@ -34,35 +34,66 @@ public class ServletPresence extends HttpServlet implements Observer { } comUDP.setObserver(this); } - - //Permet a un utilisateur externe de s'ajouter/s'enlever à la liste des utilisateurs externes : au tout début de l'application - private void suscribe() { + + private int getIndexByID(String id) { + for(int i=0; i < remoteUsers.size() ; i++) { + if(remoteUsers.get(i).getId().equals(id) ) { + return i; + } + } + return -1; } - private void unsubscribe() { - } - - //Permet de dire si on a changé de pseudo - private void publish() { - } - - //Informe de la modification de la liste tous les utilisateurs internes et externes => par reponse HTTP - private void snotify() { - + //Informe de la modification de la liste tous les utilisateurs internes et externes + private void snotify(MessageSysteme message, Utilisateur user) { + if (remoteUsers.contains(user)) { + //diffuse le message localement, envoie la nouvelle liste des utilisateurs aux utilisateurs externes SAUF L'EXPEDITEUR + comUDP.sendMessage(message); + for (Utilisateur u : remoteUsers) { + if (!u.equals(user)) { + comUDP.sendMessage(message, u.getPort()); + } + } + } + else { + //envoie la nouvelle liste des utilisateurs aux utilisateurs externes + for (Utilisateur u : remoteUsers) { + comUDP.sendMessage(message, u.getPort()); + } + } } - /** - * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) - */ + // susbribe/unsubscribe : Permet a un utilisateur externe de s'ajouter/s'enlever à la liste des utilisateurs externes : au tout début de l'application protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - // TODO Auto-generated method stub - doGet(request, response); + Utilisateur user = new Utilisateur(id, pseudo, ip, port); + remoteUsers.add(user); + } + + protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ + int index = getIndexByID(id); + Utilisateur user = remoteUsers.get(index); + remoteUsers.remove(index); } + //Permet de dire si on a changé de pseudo (pour les utilisateurs externes) + protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ + int index = getIndexByID(id); + Utilisateur user = remoteUsers.get(index); + user.setPseudo(pseudo); + } + + //Informe de la modification de la liste tous les utilisateurs internes et externes + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ + snotify(message, comUDP.getUserFromID(message.getId())); + } + @Override - //Rien a faire : pas d'affichage sur un serveur + //Note : on part du principe que pour les communications TCP et autres, le serveur agira comme un proxy et donc que les + //utilisateurs externes n'ont pas besoin de connaitre les ip internes des machines + //Pourquoi j'ai fait ça ?????? Je change si je me souviens public void update(Object o, Object arg) { - + /*MessageSysteme message = (MessageSysteme) arg; + snotify(message, comUDP.getUserFromID(message.getId()));*/ } } diff --git a/POO_Server/src/messages/Message.java b/POO_Server/src/messages/Message.java index 6036b00..334f39c 100644 --- a/POO_Server/src/messages/Message.java +++ b/POO_Server/src/messages/Message.java @@ -28,10 +28,10 @@ public abstract class Message implements Serializable { String[] parts = messageString.split("###"); switch (parts[0]) { case "JE_SUIS_CONNECTE" : - return new MessageSysteme(TypeMessage.JE_SUIS_CONNECTE); + return new MessageSysteme(TypeMessage.JE_SUIS_CONNECTE, parts[2]); case "JE_SUIS_DECONNECTE" : - return new MessageSysteme(TypeMessage.JE_SUIS_DECONNECTE); + return new MessageSysteme(TypeMessage.JE_SUIS_DECONNECTE, parts[2]); case "INFO_PSEUDO" : return new MessageSysteme(TypeMessage.INFO_PSEUDO, parts[1], parts[2], Integer.parseInt(parts[3]) ); @@ -51,8 +51,8 @@ public abstract class Message implements Serializable { //tests ici 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 m1 = new MessageSysteme(TypeMessage.JE_SUIS_CONNECTE, "sahiu"); + Message m2 = new MessageSysteme(TypeMessage.JE_SUIS_DECONNECTE, "putbezfjk"); Message m3 = new MessageSysteme(TypeMessage.INFO_PSEUDO, "pseudo156434518", "id236", 1500); Message m4 = new MessageTexte(TypeMessage.TEXTE, "blablabla"); Message m5 = new MessageFichier(TypeMessage.FICHIER, "truc", ".pdf"); diff --git a/POO_Server/src/messages/MessageSysteme.java b/POO_Server/src/messages/MessageSysteme.java index 0ff111d..06d3e07 100644 --- a/POO_Server/src/messages/MessageSysteme.java +++ b/POO_Server/src/messages/MessageSysteme.java @@ -7,11 +7,11 @@ public class MessageSysteme extends Message { private String id; private int port; - public MessageSysteme(TypeMessage type) throws MauvaisTypeMessageException{ + public MessageSysteme(TypeMessage type, String id) throws MauvaisTypeMessageException{ if ((type==TypeMessage.JE_SUIS_CONNECTE)||(type==TypeMessage.JE_SUIS_DECONNECTE)||(type==TypeMessage.MESSAGE_NUL)) { this.type=type; this.pseudo=""; - this.id=""; + this.id=id; this.port = -1; } else throw new MauvaisTypeMessageException();