Exemple47_TalkUsRetourTélécharger Programme de communication socket avec ou non mise en place d'une politique de sécurité. Les programmes s'échangent des messages textes. IhmTalk.java import java.io.*; import java.awt.*; import java.net.*; import java.util.*; import fr.cnam.ihm.*; // Classe d'ihm de gestion d'un talker qui permet // d'envoyer un message a un autre talker qui serait present // sur le reseau // public class IhmTalk implements FormulaireInt { private Formulaire form; // Le formulaire d'ihm private String texte; // Texte affiche dans la zone d'historique private Vector<String> list; // liste ihm des host:port private int portCurrent; // port courant utilise par le talker de cet ihm private int portLocal; // port local utilise par le talker de cet ihm private String ipEcouteur; // adresse ip du talker courant private int portEcouteur; // port du talker courant private ArrayList<String> hosts; // Les noms des hosts des talkers potentiels private ArrayList<Integer> ports; // Les ports des talkers potentiels // Constructeur // public IhmTalk(int portCurrent,int portLocal,ArrayList<String> hosts, ArrayList<Integer> ports) throws Exception { // Initialisation par defaut des attributs // this.texte=""; this.list=new Vector<String>(); this.portCurrent=portCurrent; this.portLocal=portLocal; this.hosts=hosts; this.ports=ports; this.ipEcouteur=null; // Creation du formualire d'ihm et des elements d'ihm // form = new Formulaire("TALKER",this,430,300); form.addButton("PINGS","Rafraichir"); form.addListScroll("TALKERS", "Talkers", true, null, 200,200); form.addText("ECOUTEUR","Discussion avec:",false,""); form.addText("MESSAGE","Message",true,""); form.addButton("ENVOYER","Envoyer"); form.setPosition(210,0); form.addZoneText("zone","Historique",false,"",200,200); form.desactiver("MESSAGE"); form.desactiver("ENVOYER"); try{form.afficher();}catch(Exception ex){} }// Constructeur // Methode qui essaye de communiquer avec chacune des machines/ports // passes en parametre du programme // public void pings() { for(int port:ports) for(String h:hosts) { if ( (h.equals("localhost"))&&(port==portCurrent) ) continue; Thread thread = new Thread(){ public void run(){try{ try{ Socket soc; if (portLocal==0) soc = new Socket(InetAddress.getByName(h),port); else { soc = new Socket(Inet4Address.getByName(h),port, Inet4Address.getLocalHost(),portLocal); soc.setSoLinger(true,0); } OutputStream os=soc.getOutputStream(); DataOutputStream dos=new DataOutputStream(os); InputStream is=soc.getInputStream(); DataInputStream dis=new DataInputStream(is); dos.writeUTF(TalkMain.PING); String reponse = dis.readUTF(); if (reponse.equals(TalkMain.IDENT_TALK)) { // Ne pas ajouter si existe deja dans la liste String adr=h+":"+port; if (! list.contains(adr)) { // Ajout dans la liste et maj de l'ihm list.add(h+":"+port); form.setListData("TALKERS",list.toArray(new String[0])); } soc.close(); } }catch(Exception ex) { /* // Si impossible de communiquer avec un talker sur le reseau et // qu'il etait present dans la liste alors le supprimer de la liste // String adr = h+":"+port; System.out.println(">>> "+adr+" "+ex); int index = list.indexOf(adr); if (index!=-1) list.remove(index); form.setListData("TALKERS",list.toArray(new String[0])); */ } }catch(Exception ex2){}; }}; thread.start(); } } // Ajout d'un texte dans la zone d'historique // public void add(String str) { texte=texte+"\n"+str; form.setValeurChamp("zone",texte); } // Action dans un des elements de l'IHM // public void submit(Formulaire form,String nomSubmit) { // Rafraichir la liste en essayant de "pinguer" les machines // if (nomSubmit.equals("PINGS")) { pings(); } // Action quand on clique sur un des talkers present dans la liste // des adresses IP+port // if (nomSubmit.equals("TALKERS")) { String ip = form.getValeurChamp("TALKERS"); if(!ip.equals("")) { String[] t=ip.split("[:]",2); // On memorise l'adresse IP+port selectionne ipEcouteur = t[0]; portEcouteur = Integer.parseInt(t[1]); // On met a jour l'ihm permettant d'envoyer une message form.setValeurChamp("ECOUTEUR",ip); form.activer("MESSAGE"); form.activer("ENVOYER"); } } // Action quand on envoie un message a un talker // if (nomSubmit.equals("ENVOYER")) { // Si un talker a ete selectionne // if (ipEcouteur!=null) { try{ // On ouvre un socket pour y ecrire le message String mess = form.getValeurChamp("MESSAGE"); Socket soc; if (portLocal==0) soc = new Socket(InetAddress.getByName(ipEcouteur),portEcouteur); else { soc = new Socket(Inet4Address.getByName(ipEcouteur),portEcouteur, Inet4Address.getLocalHost(),portLocal); soc.setSoLinger(true,0); } OutputStream os=soc.getOutputStream(); InputStream is = soc.getInputStream(); DataOutputStream dos=new DataOutputStream(os); DataInputStream dis = new DataInputStream(is); dos.writeUTF(ipEcouteur+":\n"+mess); dis.readUTF(); soc.close(); }catch(Exception ex) { // Si exception alors le talker avec qui on echange s'est deconnecte // add(ipEcouteur+"\nn'est plus accessible"); ipEcouteur=null; form.desactiver("MESSAGE"); form.desactiver("ENVOYER"); } } } } }//class TalkMain.java import java.io.*; import java.awt.*; import java.net.*; import java.util.*; import java.util.stream.*; import fr.cnam.ihm.*; // Programme principal qui cree l'ihm du talker et cree un Server de Socket // qui est a l'ecoute des autres talkers // public class TalkMain { static public final String IDENT_TALK = "IDENT TALK OK"; static public final String PING = "PING"; public static void main(String args[]) throws Exception { // Syntaxe de la ligne de commande d'execution // port [portLocal] [h1 h2 ... ] [: p1 p2 ..] // // port : le port utilise pour le serveur de socket // portLocal : le port local utilise pour ouvrir un socket. // Si portLocal==0 alors on laisse l'OS pour designer ce port // Sinon c'est ce port qui est utilise pour ouvrir un socket. // Dans ce cas on met en place une politique de securite // de l'utilisation des ports : // - voir java.policy de -Djava.security.policy=java.policy // // hi : ce sont les noms des hosts utilises sur le reseau // pi : ce sont les ports utilises par les serveurs de sockets du reseau // // Seul le premier parametre est obligatoire. // // En absence des autres parametres les valeurs par defaut sont : // portLocal = 0 // hi = localhost // pi = 9100 9101 9102 // int port; int portLocal; ArrayList<String> hosts = new ArrayList<String>(); ArrayList<Integer> ports = new ArrayList<Integer>(); if (args.length==0) { System.out.println("Pas de parametre.\nSyntaxe: port [portLocal] [h1 h2 ... ] [: p1 p2 ..]\n"); System.exit(1); } if (args.length==1) { port = Integer.parseInt(args[0]); portLocal=0; hosts.add("localhost"); ports.add(9100); ports.add(9101); ports.add(9102); } else //parametres > 2 { port = Integer.parseInt(args[0]); portLocal = Integer.parseInt(args[1]); // Parcours des hosts et ports int r=1; // 1 => hosts 2 => ports for(int i=2;i<args.length;i++) { if ((r==1)&&(!args[i].equals(":"))) hosts.add(args[i]); if (r==2) ports.add(Integer.parseInt(args[i])); if (args[i].equals(":")) r=2; } // Si apres le parcours pas de hosts ou pas de ports if (hosts.size()==0) hosts.add("localhost"); if (ports.size()==0) { ports.add(9100); ports.add(9101); ports.add(9102); } } // Si portLocal==0 alors pas de securite a prendre en compte // if (portLocal!=0) System.setSecurityManager(new SecurityManager()); //Creation de l'ihm // IhmTalk ihm = new IhmTalk(port,portLocal,hosts,ports); // Creation du serveur de socket // qui ajoute dans l'ihm le texte recu sauf si "PING" est recu. // Le PING est utilise pour verifier si un talker est present sur // le reseau // String str; ServerSocket ssoc; ssoc = new ServerSocket(port); while(true) { System.out.println("En attente sur "+port); Socket soc = ssoc.accept(); InputStream is = soc.getInputStream(); OutputStream os = soc.getOutputStream(); DataInputStream dis = new DataInputStream(is); DataOutputStream dos = new DataOutputStream(os); str = dis.readUTF(); if (str.equals(PING)) { dos.writeUTF(IDENT_TALK); } else { ihm.add(str); // Ajout dans l'ihm du texte recu dos.writeUTF("OK"); } } } } compil.bat mkdir bin del /f /s /q bin\*.class javac -d bin -classpath "." *.java pause fr cnam ihm tore java.policy grant{ permission java.net.SocketPermission "*:9100-9110","accept,connect,listen"; }; run1Talker9100.bat cd bin java -classpath "." TalkMain 9100 pause run1Talker9101.bat cd bin java -classpath "." TalkMain 9101 pause run1Talker9102.bat cd bin java -classpath "." TalkMain 9102 pause run2Talker9100-9101.bat java -Djava.security.policy=java.policy -classpath "bin" TalkMain 9100 9101 LFR038644 A308-001 A308-002 : 9100 9102 9104 pause run2Talker9102-9103.bat java -Djava.security.policy=java.policy -classpath "bin" TalkMain 9102 9103 LFR038644 A308-001 A308-002 : 9100 9102 9104 pause run2Talker9104-9105.bat java -Djava.security.policy=java.policy -classpath "bin" TalkMain 9104 9105 localhost : 9100 9102 9104 pause