diff --git a/Implementation/src/ChatApp.java b/Implementation/src/ChatApp.java index 95e9a35..2894f65 100644 --- a/Implementation/src/ChatApp.java +++ b/Implementation/src/ChatApp.java @@ -1,9 +1,14 @@ import java.io.IOException; +import java.net.DatagramSocket; import java.net.InetAddress; +import java.net.InterfaceAddress; +import java.net.NetworkInterface; +import java.net.SocketException; import java.net.UnknownHostException; import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; +import java.util.Enumeration; +import java.util.List; +import java.util.Objects; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -14,35 +19,36 @@ import java.util.concurrent.Executors; */ public class ChatApp { - + /* Liste des utilisateurs actifs */ private ListUtilisateurs actifUsers ; private static ArrayList ListPort = new ArrayList(); private Map mapHistorique ; - - - - - - + + + + + + public static ArrayList getListPort() { return ListPort; } /* ChatApp est associé à un utilisateur */ private Utilisateur me; - + /** * Constructeur de l'application de chat - * + * * @param pseudo Pseudo de l'utilisateur - * @param port Port de communication + * @param port Port de communication */ public ChatApp(String pseudo, Integer port){ this.actifUsers = new ListUtilisateurs() ; - // Recuperer adresse IP de l'utilisateur + // Recuperer adresse IP de l'utilisateur InetAddress ip = null ; try { + //ip = InetAddress.getByName("192.168.1.72"); ip = InetAddress.getLocalHost(); } catch (UnknownHostException e) { e.printStackTrace(); @@ -52,69 +58,72 @@ public class ChatApp { this.actifUsers.addList(getMe()); this.mapHistorique = new HashMap() ; } - + public void majHistorique(String pseudo,Historique h) { getMapHistorique().put(h.getUser2().getPseudo(),h); } - - + + /** - * Modification du pseudo de l'utilisateur + * 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 + // @ 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"; - for(Integer p : ListPort ) { + /*for(Integer p : ListPort ) { if(!(p.equals(this.getMe().getPort()))) { UDPEchange.connexion(broadcastAdress,broadcastMessage, p); } - } + }*/ + UDPEchange.connexion(broadcastAdress,broadcastMessage, 1024); } - - + + /** - * Methode appelée lors de la connexion d'un nouvel utilisateur. + * 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 + // @ 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.getMe().toString() ; - for(Integer p : ListPort ) { - if(!(p.equals(this.getMe().getPort()))) - { - UDPEchange.connexion(broadcastAdress,broadcastMessage, p); - } + /*for(Integer p : ListPort ) { + if(!(p.equals(this.getMe().getPort()))) + { + UDPEchange.connexion(broadcastAdress,broadcastMessage, p); } + }*/ + UDPEchange.connexion(broadcastAdress,broadcastMessage, 1024); } - + /** - * Methode appelée lors de la déconnexion de l'utilisateur. + * 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 + // @ 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() ; - for(Integer p : ListPort ) { - if( !(p.equals(this.getMe().getPort()))) - { - UDPEchange.connexion(broadcastAdress,broadcastMessage, p); - } + /*for(Integer p : ListPort ) { + if(!(p.equals(this.getMe().getPort()))) + { + UDPEchange.connexion(broadcastAdress,broadcastMessage, p); } + }*/ + UDPEchange.connexion(broadcastAdress,broadcastMessage, 1024); } - + public static void main (String[] args) throws IOException { //Integer p = 2345 ; ChatApp app = new ChatApp(args[0],Integer.parseInt(args[1])) ; @@ -123,14 +132,21 @@ public class ChatApp { ListPort.add(1234); ListPort.add(3000); ListPort.add(4000); + InetAddress localHost = InetAddress.getLocalHost(); + System.out.println("Mon adresse:" + localHost.toString()); + /*for(InetAddress broadcastAddr : UDPEchange.listAllBroadcastAddresses()) { + System.out.println("Broadcast sent with address " + broadcastAddr.toString()); + }*/ + //InetAddress broadcastAddress = InterfaceAddress.getBroadcast(); + //System.out.println("Mon adresse:" + localHost.toString()); ExecutorService exec = Executors.newFixedThreadPool(1000); - exec.submit(new Runner(app)); + exec.submit(new Runner(app)); try { app.connexion(); } catch (IOException e) { e.printStackTrace(); } - + if (app.getMe().getPort() == 4000) { try { Thread.sleep(2000); @@ -163,7 +179,7 @@ public class ChatApp { public Map getMapHistorique() { return mapHistorique; } - + public Historique getHist(String pseudo) { Historique h = this.mapHistorique.get(pseudo); if( h != null) { @@ -174,19 +190,21 @@ public class ChatApp { return h ; } } - - + + + + } + class Runner implements Runnable { - ChatApp app ; + ChatApp app ; public Runner(ChatApp app) { this.app = app ; } @Override public void run() { - + UDPEchange.ecouteUDP(app); - + } } - diff --git a/Implementation/src/MessageHorodate.java b/Implementation/src/MessageHorodate.java index e98a299..6a07bae 100644 --- a/Implementation/src/MessageHorodate.java +++ b/Implementation/src/MessageHorodate.java @@ -1,5 +1,3 @@ -import java.net.InetAddress; -import java.net.UnknownHostException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -36,6 +34,7 @@ public class MessageHorodate { * @return Les differents attributs de la classe sous forme de string *

*/ + @Override public String toString() { String Msg = ""; Msg += ("Destinataire: " + this.destinataire + "\n") ; diff --git a/Implementation/src/RunnerUDP.class b/Implementation/src/RunnerUDP.class index 6429c55..f96af0f 100644 Binary files a/Implementation/src/RunnerUDP.class and b/Implementation/src/RunnerUDP.class differ diff --git a/Implementation/src/TCPEchange.java b/Implementation/src/TCPEchange.java index 978c739..804b867 100644 --- a/Implementation/src/TCPEchange.java +++ b/Implementation/src/TCPEchange.java @@ -1,5 +1,4 @@ import java.io.InputStream; -import java.io.OutputStream; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; diff --git a/Implementation/src/UDPEchange.class b/Implementation/src/UDPEchange.class index 64e2d0b..a1eed64 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 14e5905..b3d01a1 100644 --- a/Implementation/src/UDPEchange.java +++ b/Implementation/src/UDPEchange.java @@ -2,7 +2,12 @@ import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; +import java.net.NetworkInterface; import java.net.SocketException; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.Objects; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** @@ -26,12 +31,24 @@ public class UDPEchange { */ public static void connexion( InetAddress broadcastAdress , String broadcastMessage , Integer port) throws IOException { // Envoie en broadcast à tous les utilsateurs - DatagramSocket socket = new DatagramSocket(); - socket.setBroadcast(true); - byte[]buffer = broadcastMessage.getBytes(); - DatagramPacket packet = new DatagramPacket( buffer, buffer.length, InetAddress.getLoopbackAddress(), port ); - socket.send(packet); - socket.close(); + for (InetAddress broadcastAddr : listAllBroadcastAddresses()) { + DatagramSocket socket = new DatagramSocket(); + socket.setBroadcast(true); + byte[]buffer = broadcastMessage.getBytes(); + DatagramPacket packet = new DatagramPacket( buffer, buffer.length, broadcastAddr, port ); + socket.send(packet); + socket.close(); + System.out.println("Broadcast sent with address " + broadcastAddr.toString()); + } + /* + DatagramSocket socket = new DatagramSocket(); + socket.setBroadcast(true); + byte[]buffer = broadcastMessage.getBytes(); + DatagramPacket packet = new DatagramPacket( buffer, buffer.length, broadcastAdress, port ); + socket.send(packet); + socket.close(); + */ + System.out.println("***********Message envoye***********"); System.out.println("Dest Ip: " + broadcastAdress.toString()); System.out.println("Dest port: " + port.toString()); @@ -89,8 +106,31 @@ public class UDPEchange { System.out.println(broadcastMessage); System.out.println("************************************"); } + + + static List listAllBroadcastAddresses() throws SocketException { + List broadcastList = new ArrayList<>(); + Enumeration interfaces + = NetworkInterface.getNetworkInterfaces(); + while (interfaces.hasMoreElements()) { + NetworkInterface networkInterface = interfaces.nextElement(); + + if (networkInterface.isLoopback() || !networkInterface.isUp()) { + continue; + } + + networkInterface.getInterfaceAddresses().stream() + .map(a -> a.getBroadcast()) + .filter(Objects::nonNull) + .forEach(broadcastList::add); + } + return broadcastList; + } + } + + /** *

* Classe implémentant l'interface Runnable. @@ -241,4 +281,8 @@ class RunnerUDP implements Runnable { ( app.getActifUsers() ).supprimerList(Utilisateur.stringToUtilisateur(received.split("\n")[1])); } } + + + + } diff --git a/Implementation/src/Utilisateur.java b/Implementation/src/Utilisateur.java index de29299..67620ea 100644 --- a/Implementation/src/Utilisateur.java +++ b/Implementation/src/Utilisateur.java @@ -32,6 +32,7 @@ public class Utilisateur extends Object { return ip; } + @Override public String toString(){ String s = ""; s+="pseudo " + this.pseudo + " | "; diff --git a/Implementation/src/View.java b/Implementation/src/View.java new file mode 100644 index 0000000..5a0088a --- /dev/null +++ b/Implementation/src/View.java @@ -0,0 +1,3 @@ +public class View{ + +}