Professional Documents
Culture Documents
Samia Bouzefrane Matre de Confrences Laboratoire CEDRIC Conservatoire National des Arts et Mtiers 292 rue Saint Martin 75141 Paris Cdex 03 samia.bouzefrane@cnam.fr http://cedric.cnam.fr/~bouzefra
public class Reverse implements ReverseInterface { public String reverseString (String ChaineOrigine){ int longueur=ChaineOrigine.length(); StringBuffer temp=new StringBuffer(longueur); for (int i=longueur; i>0; i--) { temp.append(ChaineOrigine.substring(i-1, i));} return temp.toString(); } }
On doit pouvoir invoquer une mthode de cet objet situ sur une autre machine de la mme faon quun objet local : monObjetDisribue.uneMethodeDeLOD();
CNAM - Laboratoire CEDRIC Samia BOUZEFRANE (samia.bouzefrane@cnam.fr)
On doit pouvoir utiliser cet objet distribu sans connatre sa localisation. On utilise pour cela un service sorte dannuaire, qui doit nous renvoyer son adresse.
monObjetDistribue= ServiceDeNoms.recherche(myDistributedObject);
On doit pouvoir utiliser un objet distribu comme paramtre dune mthode locale ou distante.
x=monObjetLocal.uneMethodeDeLOL(monObjetDistribue); x= monObjetDistribue.uneMethodeDeLOD(autreObjetDistribue);
CNAM - Laboratoire CEDRIC Samia BOUZEFRANE (samia.bouzefrane@cnam.fr)
On doit pouvoir rcuprer le rsultat dun appel de mthode sous la forme dun objet distribu.
monObjetDistribue=autreObjetDistribue.uneMethodeDeLOD(); monObjetDistribue=monObjetLocal.uneMethodeDeLOL();
Prsentation
RMI est un systme dobjets distribus constitu uniquement dobjets java ; RMI est une Application Programming Interface (intgre au JDK 1.1 et plus) ; Dvelopp par JavaSoft ;
Mcanisme qui permet lappel de mthodes entre objets Java qui sexcutent ventuellement sur des JVM distinctes ; L appel peut se faire sur la mme machine ou bien sur des machines connectes sur un rseau ; Utilise les sockets ; Les changes respectent un protocole propritaire : Remote Method Protocol ; RMI repose sur les classes de srialisation.
Architecture
Invocation de la mthode distante Objet distant Application
Stub
Squelette
Prsentation
Session
TCP/IP
TCP/IP
Transport/rseau
Interface Hard
Interface Hard
10
Appel local
mthode+ arguments
Client
interface
Stub
Skeleton
interface
Objet
retour + exception
Appel distant
Rseau CNAM - Laboratoire CEDRIC Samia BOUZEFRANE (samia.bouzefrane@cnam.fr)
11
Les amorces (Stub/Skeleton) Elles assurent le rle dadaptateurs pour le transport des appels distants Elles ralisent les appels sur la couche rseau Elles ralisent lassemblage et le dsassemblage des paramtres (marshalling, unmarshalling) Une rfrence dobjets distribu correspond une rfrence damorce Les amorces sont cres par le gnrateur rmic.
CNAM - Laboratoire CEDRIC Samia BOUZEFRANE (samia.bouzefrane@cnam.fr)
12
Les Stubs
Reprsentants locaux de lobjet distribu ; Initient une connexion avec la JVM distante en transmettant linvocation distante la couche des rfrences dobjets ; Assemblent les paramtres pour leur transfert la JVM distante ; Attendent les rsultats de linvocation distante ; Dsassemblent la valeur ou lexception renvoye ; Renvoient la valeur lappelant ; Sappuient sur la srialisation.
CNAM - Laboratoire CEDRIC Samia BOUZEFRANE (samia.bouzefrane@cnam.fr)
13
Les squelettes
Dsassemblent les paramtres pour la mthode distante ; Font appel la mthode demande ; Assemblage du rsultat (valeur renvoye ou exception) destination de lappelant.
14
15
La couche transport
ralise les connexions rseau bases sur les flux entre les JVM emploie un protocole de communication propritaire (JRMP: Java Remote Method Invocation) bas sur TCP/IP Le protocole JRMP a t modifi afin de supprimer la ncessit des squelettes car depuis la version 1.2 de Java, une mme classe skeleton gnrique est partage par tous les objets distants.
16
Serveur
3. Interroger
2. Publier
Application Cliente
Objet distant
7. Appel mthode
Skeleton
6. Arguments srialisation
8. Retour
9. Rsultat
17
18
On dfinit : ReverseInterface.java : interface qui dcrit lobjet distribu Reverse.java : qui implmente lobjet distribu ReverseServer.java : le serveur RMI ReverseClient.java : le client qui utilise lobjet distribu
19
Fichiers ncessaires
Ct Client
Ct Serveur
20
21
import java.rmi.Remote; import java.rmi.RemoteException; public interface ReverseInterface extends Remote { String reverseString(String chaine) throws RemoteException; }
22
23
24
Le serveur
Programme lcoute des clients ; Enregistre lobjet distribu dans rmiregistry
Naming.rebind("rmi://hote.cnam.fr:1099/MyReverse", rev);
On installe un gestionnaire de scurit si le serveur est amen charger des classes (inutile si les classes ne sont pas charges
dynamiquement) System.setSecurityManager(new RMISecurityManager());
25
Le serveur
import java.rmi.*; import java.rmi.server.*; public class ReverseServer { public static void main(String[] args) { try { System.out.println( "Serveur : Construction de limplmentation "); Reverse rev= new Reverse(); System.out.println("Objet Reverse li dans le RMIregistry"); Naming.rebind("rmi://sinus.cnam.fr:1099/MyReverse", rev); System.out.println("Attente des invocations des clients "); } catch (Exception e) { System.out.println("Erreur de liaison de l'objet Reverse"); System.out.println(e.toString()); } } // fin du main } // fin de la classe
26
Le Client
Le client obtient un stub pour accder lobjet par une URL RMI
ReverseInterface ri = (ReverseInterface) Naming.lookup ("rmi://sinus.cnam.fr:1099/MyReverse");
Une URL RMI commence par rmi://, le nom de machine, un numro de port optionnel et le nom de lobjet distant. rmi://hote:2110/nomObjet Par dfaut, le numro de port est 1099 dfini (ou dfinir) dans /etc/services : rmi 1099/tcp
CNAM - Laboratoire CEDRIC Samia BOUZEFRANE (samia.bouzefrane@cnam.fr)
27
Le Client
Installe un gestionnaire de scurit pour contrler les stubs chargs dynamiquement :
System.setSecurityManager(new RMISecurityManager());
28
Le Client
import java.rmi.*; import ReverseInterface; public class ReverseClient { public static void main (String [] args) { System.setSecurityManager(new RMISecurityManager()); try{ ReverseInterface rev = (ReverseInterface) Naming.lookup ("rmi://sinus.cnam.fr:1099/MyReverse"); String result = rev.reverseString (args [0]); System.out.println ("L'inverse de "+args[0]+" est "+result); } catch (Exception e) { System.out.println ("Erreur d'accs l'objet distant."); System.out.println (e.toString()); } } }
CNAM - Laboratoire CEDRIC Samia BOUZEFRANE (samia.bouzefrane@cnam.fr)
29
Le Client
Pour que le client puisse se connecter rmiregistry, il faut lui fournir un fichier de rgles de scurit client.policy.
$more client.policy grant { permission java.net.SocketPermission ":1024-65535", "connect" ; permission java.net.SocketPermission ":80", "connect"; }; $more client1.policy
grant { permission java.security.AllPermission; };
CNAM - Laboratoire CEDRIC Samia BOUZEFRANE (samia.bouzefrane@cnam.fr)
30
Compilation et Excution
- Compiler les sources (interface, implmentation de lobjet, le serveur et le client ) :
sinus> javac *.java
- Dmarrer rmiregistry :
sinus>rmiregistry -J-Djava.security.policy=client1.policy&
CNAM - Laboratoire CEDRIC Samia BOUZEFRANE (samia.bouzefrane@cnam.fr)
31
- Lancer le serveur :
sinus>java ReverseServer & Serveur :Construction de limplmentation Objet Reverse li dans le RMIregistry Attente des invocations des clients
- Excuter le client :
cosinus>java -Djava.security.policy=client1.policy ReverseClient Alice L'inverse de Alice est ecilA
32
Charger des classes de manire dynamique - Les dfinitions de classe sont hberges sur un serveur Web ; - Les paramtres, les stubs sont envoys au client via une connexion au serveur Web; - Pour fonctionner, une application doit tlcharger les fichiers de classe. Chargement dynamique - vite de disposer localement de toutes les dfinitions de classe ; - les mmes fichiers de classe (mme version) sont partags par tous les clients - charge une classe au besoin.
CNAM - Laboratoire CEDRIC Samia BOUZEFRANE (samia.bouzefrane@cnam.fr)
33
Ct Client
Ct Serveur
34
le client : ReverseClient
Serveur Web
35
le client : DynamicClient
Serveur Web
36
Serveur Web
CNAM - Laboratoire CEDRIC
37
http://) o peuvent se trouver les classes. Lorsque RMI srialise lobjet (envoy comme paramtre ou reu comme rsultat), il rajoute lURL spcifie par codebase.
java.rmi.server.useCodebaseOnly : informe le client que le
38
Principe du chargement dynamique A lenregistrement (dans rmiregistry) de l objet distant, le codebase est spcifi par java.rmi.server.codebase. A lappel de bind(), le registre utilise ce codebase pour trouver les fichiers de classe associs lobjet. Le client recherche la dfinition de classe du stub dans son classpath. Sil ne la trouve pas, il essayera de la rcuprer partir du codebase. Une fois que toutes les dfinitions de classe sont disponibles, la mthode proxy du stub appelle les objets sur le serveur.
39
- Les classes java.rmi.RMISecurityManager et java.rmi.server.RMIClassLoader vrifient le contexte de scurit avant de charger des classes partir demplacements distants. - La mthode LoadClass de RMIClassLoader charge la classe partir du codebase spcifi.
40
-Sur la machine du client, crire le code du client. -Compiler le client statique et linstaller ventuellement sur le site Web. -Compiler le client dynamique et le lancer en prcisant lURL des fichiers de classe.
Samia BOUZEFRANE (samia.bouzefrane@cnam.fr)
41
// linterface import java.rmi.Remote; import java.rmi.RemoteException; public interface ReverseInterface extends Remote { String reverseString(String chaine) throws RemoteException; }
42
Lobjet Reverse :
import java.rmi.*; import java.rmi.server.*; public class Reverse extends UnicastRemoteObject implements ReverseInterface { public Reverse() throws RemoteException { super(); } public String reverseString (String ChaineOrigine) throws RemoteException { int longueur=ChaineOrigine.length(); StringBuffer temp=new StringBuffer(longueur); for (int i=longueur; i>0; i--) { temp.append(ChaineOrigine.substring(i-1, i)); } return temp.toString(); } }
CNAM - Laboratoire CEDRIC Samia BOUZEFRANE (samia.bouzefrane@cnam.fr)
43
Le serveur dynamique :
import import import import import java.rmi.Naming; java.rmi.Remote; java.rmi.RMISecurityManager; java.rmi.server.RMIClassLoader; java.util.Properties;
public class DynamicServer { public static void main(String[] args) { System.setSecurityManager(new RMISecurityManager()); try { Properties p= System.getProperties(); String url=p.getProperty("java.rmi.server.codebase"); Class ClasseServeur = RMIClassLoader.loadClass(url, "Reverse"); Naming.rebind("rmi://sinus.cnam.fr:1099/MyReverse", (Remote)ClasseServeur.newInstance());
CNAM - Laboratoire CEDRIC Samia BOUZEFRANE (samia.bouzefrane@cnam.fr)
44
45
Le client :
import java.rmi.*; public class ReverseClient { public ReverseClient () { String mot="Alice"; try{ ReverseInterface rev = (ReverseInterface) Naming.lookup ("rmi://sinus.cnam.fr:1099/MyReverse"); String result = rev.reverseString(args[0]); System.out.println ("L'inverse de " + mot + " est "+result); } catch (Exception e) { System.out.println ("Erreur d'accs l'objet distant "); System.out.println (e.toString()); } } }
CNAM - Laboratoire CEDRIC Samia BOUZEFRANE (samia.bouzefrane@cnam.fr)
46
Le client dynamique :
import java.rmi.RMISecurityManager; import java.rmi.server.RMIClassLoader; import java.util.Properties; public class DynamicClient { public DynamicClient (String [] args) throws Exception { Properties p = System.getProperties(); String url = p.getProperty("java.rmi.server.codebase"); Class ClasseClient = RMIClassLoader.loadClass(url, "ReverseClient"); // lancer le client Constructor [] C = ClasseClient.getConstructors(); C[0].newInstance(new Object[]{args}); } // vrifier le passage de paramtres
CNAM - Laboratoire CEDRIC Samia BOUZEFRANE (samia.bouzefrane@cnam.fr)
47
public static void main (String [] args) { System.setSecurityManager(new RMISecurityManager()); try{ DynamicClient cli = new DynamicClient() ; } catch (Exception e) { System.out.println (e.toString()); } } }
48
sinus> ls Reverse.java ReverseInterface.java DynamicServer.java sinus> javac *.java sinus> rmic -v1.2 Reverse sinus> mv Reverse*.class /var/www/html/samia/rmi Le rpertoire destination des fichiers de classe doit tre accessible par http. sinus> ls *.class DynamicServer.class sinus>rmiregistry -J-Djava.security.policy=client1.policy & sinus>java -Djava.security.policy=client1.policy -Djava.rmi.server.codebase= http://sinus.cnam.fr/samia/rmi DynamicServer Objet li Attente des invocations des clients ---------------------------------cosinus>ls *.java ReverseClient.java DynamicClient.java cosinus>javac *.java cosinus>java -Djava.security.policy=client1.policy -Djava.rmi.server.codebase= http://sinus.cnam.fr/samia/rmi DynamicClient Linverse de Alice est ecilA cosinus> Le chargement de ReverseClient se fera partir du rpertoire local alors que ReverseInterface et Reverse_Stub seront chargs partir du serveur Web spcifi dans la commande.
CNAM - Laboratoire CEDRIC Samia BOUZEFRANE (samia.bouzefrane@cnam.fr)
49
Java & Internet de Gilles Roussel et Etienne Duris, Ed Vuibert, 2000. Mastering RMI, Rickard berg, Ed. Willey, 2001. J2EE, Ed. Wrox, 2001. Cours RMI, D. Olivier & S. Bouzefrane, DESS SOR, universit du Havre, 2001/2002 Tutorial de Java RMI de Sun : http://java.sun.com/docs/books/tutorial/rmi/index.html
CNAM - Laboratoire CEDRIC Samia BOUZEFRANE (samia.bouzefrane@cnam.fr)
50