ExempleRMI.java import java.lang.*; import java.rmi.registry.*; import java.rmi.server.*; import java.io.*; import java.util.*; ExempleRMI.java import pkgexemple.*; public class ExempleRMI public static void main(string args[]) throws Exception int l_portadaptateur = 9999; int l_portserveursocket = 0; int l_portminclientsocket = 0; int l_portmaxclientsocket = 0; if (args.length == 4) l_portadaptateur = Integer.parseInt(args[0]); l_portserveursocket = Integer.parseInt(args[1]); l_portminclientsocket = Integer.parseInt(args[2]); l_portmaxclientsocket = Integer.parseInt(args[3]); Mise en place d'un SetSecurityManager ===================================== Fichier de defintion des droits et proprietes System.setProperty("java.security.policy","../server.java.policy"); Instanciation de la security if (l_portserveursocket!= 0) System.setSecurityManager(new RMISecurityManager()); Création de l'objet distribué HelloOD od = null; System.out.println("Création de l'objet distribué"); if (l_portserveursocket == 0) od = new HelloOD("Pierre","DUPONT"); else od = new HelloOD(l_portServeurSocket, l_portminclientsocket, l_portmaxclientsocket, "Pierre","DUPONT"); System.out.println("Enregistrement de l'objet distribué"); Naming.rebind("rmi:localhost:"+l_portAdaptateur+"/HELLO",od); System.out.println("Bus en ecoute..."); DataInputStream in = new DataInputStream(System.in); System.out.print("Taper rc, pour arreter le serveur..."); System.out.flush(); String valeur= in.readline(); Naming.unbind("rmi:localhost:"+l_portAdaptateur+"/HELLO"); UnicastRemoteObject.unexportObject(od, true /* pour forcer la destruction de l'od meme si il y encore des clients qui
l'utilisent */ ExempleRMI.java ); Page 2
Client2.java Client2.java import pkgexemple.*; public class Client2 public static void main(string args[]) throws Exception if (args.length == 3) System.setProperty("java.security.policy","../client.java.policy"); System.setSecurityManager(new RMISecurityManager()); HelloODInt helloservices = (HelloODInt)(Naming.lookup("rmi:"+args[0]+":"+args[1]+"/HELLO")); helloservices.setident(args[2],args[3]);
Client.java Client1.java import pkgexemple.*; public class Client1 public static void main(string args[]) throws Exception if (args.length == 3) System.setProperty("java.security.policy","../client.java.policy"); System.setSecurityManager(new RMISecurityManager()); HelloODInt helloservices = (HelloODInt)(Naming.lookup("rmi:"+args[0]+":"+args[1]+"/HELLO")); String messageold = ""; String message = ""; message = helloservices.hello(); while(true) if (message.equals(messageold)==false) System.out.println(message); messageold = message; message = helloservices.hello();
grant permission pour que le client puisse se connecter sur le port de l'adaptateur permission java.net.socketpermission "*:9999","connect,accept,listen,resolve"; permission pour que le client puisse se connecter sur l'objet distribué permission java.net.socketpermission "*:9200","connect,accept,listen,resolve"; permission pour que le client puisse se connecter aux ports locaux permission java.net.socketpermission "*:9300-9310","connect,accept,listen,resolve"; ;
grant On lui prefere une securite plus selectif: permission pour que le client puisse se connecter sur le port de l'adaptateur permission java.net.socketpermission "*:9999","connect,accept,listen,resolve"; permission pour que le client puisse se connecter sur l'objet distribué permission java.net.socketpermission "*:9200","connect,accept,listen,resolve"; permission pour que le client puisse se connecter sur les ports locaux permission java.net.socketpermission "*:9300-9310","connect,accept,listen,resolve"; ;
MyRMISocketFactory.java package pkgexemple; MyRMISocketFactory.java import java.rmi.server.*; import java.io.*; import java.net.*; import java.util.*; public class MyRMISocketFactory extends RMISocketFactory implements Serializable private String ident; private int portminlocalsocket; private int portmaxlocalsocket; public MyRMISocketFactory(String a_ident, int a_portminlocalsocket, int a_portmaxlocalsocket) super(); ident = a_ident; portminlocalsocket = a_portminlocalsocket; portmaxlocalsocket = a_portmaxlocalsocket; public Socket createsocket(string host, int port) throws IOException System.out.println(ident + " ** Creation d'un socket: "+ host+" "+port); System.out.println(ident + " ** plage local : " + portminlocalsocket + " " + portmaxlocalsocket); Socket socket=null; try InetAddress l_inetadress = InetAddress.getLocalHost(); int l_num=0; boolean l_fini=false; while(! l_fini) int l_port = portminlocalsocket+l_num; try socket = new Socket(host,port,l_inetAdress,l_port); System.out.println(" **Création du socket sur le port local: "+ l_port); l_fini=true; catch(exception l_ex2) System.out.println(" ** echec sur port local: "+l_port); l_num++; if (l_port > portmaxlocalsocket) l_fini=true; socket.setsotimeout(1000); socket.setsolinger(false,0); System.out.println(" ** remote port : "+ socket.getport()); System.out.println(" ** local port : "+ socket.getlocalport()); System.out.println(" ** local adress : "+ socket.getlocaladdress().tostring()); catch(exception l_ex)system.out.println(" ** Exception: "+l_ex); return socket; public ServerSocket createserversocket(int port) throws IOException System.out.println(ident + " Création du serveur de socket: "+port); return new ServerSocket(port);
HelloOD.java package pkgexemple; HelloOD.java import java.rmi.server.*; import pkgexemple.myrmisocketfactory; import pkgexemple.individu; public class HelloOD extends UnicastRemoteObject implements HelloODInt private Individu individu; public HelloOD(int a_portadaptateur, int a_portminclient, int a_portmaxclient, String nom,string prenom) throws RemoteException super(a_portadaptateur, (RMIClientSocketFactory)(new MyRMISocketFactory("*** [Client-side socket factory]", a_portminclient, a_portmaxclient)), (RMIServerSocketFactory)(new MyRMISocketFactory("*** [Server-side socket factory]", -1, -1)) ); System.out.println("Remote: "+this.tostring()); individu = new Individu(nom,prenom); public HelloOD(String nom,string prenom) throws RemoteException super(); System.out.println("Remote: "+this.tostring()); individu = new Individu(nom,prenom); public String hello() return("hello " + individu.getnom() + " " + individu.getprenom()); synchronized public void setident(string nom,string prenom) individu.setnom(nom); individu.setprenom(prenom); public Individu getindividu() return(individu); public void setindividu(individu a_individu) individu = a_individu;
HelloODInt.java package pkgexemple; HelloODInt.java public interface HelloODInt extends Remote POUR LE CAS A ============= public String hello() throws RemoteException; public void setident(string nom,string prenom) throws RemoteException; POUR LE CAS B ============= public Individu getindividu() throws RemoteException; public void setindividu(individu a_individu) throws RemoteException;
Individu.java package pkgexemple; Individu.java import java.rmi.server.*; import java.io.serializable; public class Individu implements Serializable String nom; String prenom; public Individu(String a_nom,string a_prenom) nom = a_nom; prenom = a_prenom; public String getnom()return(nom); public String getprenom()return(prenom); public void setnom(string a_nom)nom=a_nom; public void setprenom(string a_prenom)prenom=a_prenom; public boolean equals(object a_object) if (a_object == null) return false; Individu l_ind = (Individu)a_object; return( l_ind.nom.equals(this.nom) && l_ind.prenom.equals(this.prenom) );