Cours JAVA RMI
Cours JAVA RMI
Cours JAVA RMI
INSAT 2009-2010
Classes et instances
Mcanismes de gnration dexemplaires conformes un mme Modle
Hritage
Mcanisme de spcialisation : facilite rcupration et rutilisation de lexistant
Polymorphisme
Mises en uvre diverses des fonctions dune interface Remplacement dun objet par un autre si interfaces Facilite lvolution et ladaptation des applications
2 Application Rparties
INSAT 2010
Java RMI
Motivation : construction dapplications rparties avec Java
Appel de mthode au lieu dappel de procdure Invocation des mthodes sur des objets sexcutant sur une autre JVM (mme ordinateur ou sur un autre ordinateur du rseau)
voir http://java.sun.com/docs/books/tutorial/rmi/
3 Application Rparties INSAT 2010
4 Application Rparties
INSAT 2010
Skeleton
Invoque des mthodes sur l'objet local rfrenc pour le compte d'une souche Convertit les valeurs de retour en un format transmissible via le rseau (marshalling) Reconstruit les arguments partir de donnes reues par le rseau (unmarshalling) Il nest plus indispensable depuis le JDK 1.2
Invocation mthode
Stub
Skeleton
rponse
Implmentation
Stub
Reprsente un objet distant Convertit les arguments en un format transmissible via le rseau (marshalling) Reconstruit les valeurs de retour partir de donnes reues par le rseau (unmarshalling)
Invocation mthode
Objet Client
rponse
Stub
Skeleton
Fonctionnement de RMI
Lorsqu'un objet instanci sur une machine cliente dsire accder des mthodes d'un objet distant, il effectue les oprations suivantes :
il localise l'objet distant grce un service de nommage: le registre RMI il obtient dynamiquement une image virtuelle de l'objet distant (appele stub ou souche en franais). Le stub possde exactement la mme interface que l'objet distant. Le stub transforme l'appel de la mthode distante en une suite d'octets, c'est ce que l'on appelle la srialisation, puis les transmet au serveur instanciant l'objet sous forme de flot de donnes. On dit que le stub "marshalise" les arguments de la mthode distante. Le squelette instanci sur le serveur "dsrialise" les donnes envoyes par le stub (on dit qu'il les "dmarshalise"), puis appelle la mthode en local Le squelette rcupre les donnes renvoyes par la mthode (type de base, objet ou exception) puis les marshalise le stub dmarshalise les donnes provenant du squelette et les transmet l'objet faisant l'appel de mthode distance
12 Application Rparties
INSAT 2010
Le RMIRegistry (2/2)
Programme excutable fourni pour toutes les plates formes S'excute sur un port (1099 par dfaut) sur la machine serveur Pour des raisons de scurit, seuls les objets rsidant sur la mme machine sont autoriss lier/dlier des rfrences Un service de nommage est lui-mme localis l'aide d'une URL
La classe java.rmi.Naming
permet de manipuler le RMIRegistry supporte des mthodes statiques permettant de
Lier des rfrences d'objets serveur
Naming.bind(...) et Naming.rebind(...)
17 Application Rparties
INSAT 2010
18 Application Rparties
INSAT 2010
Passage de paramtres/donnes
Lors d'appel de mthodes distantes : 4 cas pour grer les paramtres ou la valeur retourne selon la classe du paramtre
Si classe implmente Remote : passage par adresse
On passe ou rcupre la rfrence sur un objet distant
Pour types primitifs : passage par valeur galement Si classe n'implmente pas Serializable : objet ne peut pas tre paramtre ou la classe ne peut pas tre un type de retour
Les paramtres ou valeurs de retour sont forcment srialiss pour tre transmis via le rseau
22 Application Rparties
INSAT 2010
Sur la machine serveur : crer les talons client et serveur pour les objets appels distance ( partir de leurs interfaces) - ici une seule classe, Hello
rmic keep <InterfaceImpl>
N.B. cette commande construit et compile les talons client <InterfaceImpl>_Stub.java et serveur <InterfaceImpl>_Skel.java. Loption -keep permet de garder les sources de ces talons Sur la machine client : compiler les interfaces et le programme client
javac <Interface>.java <Client>.java
N.B. il est prfrable de regrouper dans un fichier .jar les interfaces des objets appels distance, ce qui permet de les rutiliser pour le serveur et le client -
23 Application Rparties
INSAT 2010
N.B. Par dfaut, le registry coute sur le port 1099. Si on veut le placer sur un autre port, il suffit de lindiquer, mais il faut aussi modifier les URL en consquence :
rmi://<serveur>:<port>/<rpertoire>
Lancer le serveur
java -Djava.rmi.server.codebase=http://<addresse>/<rpertoire des classes> -D java.security.policy=java.policy <Server> & N.B. Signification des proprits (option -D) :
Le contenu du fichier java.policy spcifie la politique de scurit. LURL donne par codebase sert au chargement de classes par le client
Lancer le client
java -Djava.security.policy=java.policy <Client> N.B. Le talon client sera charg par le client depuis le site du serveur, spcifi dans loption codebase lors du lancement du serveur
24 Application Rparties
INSAT 2010
26 Application Rparties
INSAT 2010
Les Etapes
1- Dfinir les packages 2- Crer les interfaces 3- Coder les objets passs par valeur 4- Coder les objets sur le serveur 5- Ecrire le main() sur le serveur 6- Lancer rmiregistry et le serveur 7- Coder et lancer le client
helloworld
helloworld.client
import
Helloworld.intfc
import
helloworld.server
29 Application Rparties
INSAT 2010
import java.rmi.*; interface HelloWorld extends Remote { public String sayHello() throws RemoteException; }
30 Application Rparties
INSAT 2010
Rle de linterface
HelloWorld
Exception
L exception RemoteException doit tre dclare par toutes les mthodes distantes
Appels de mthodes distants moins fiables que les appels locaux
Serveur ou connexion peut tre indisponible Panne de rseau ...
Du ct client
HelloWorld hello = ...; // Nous verrons par la suite comment obtenir // une premire rfrence sur un stub String result = hello.sayHello(); System.out.println(result);
33 Application Rparties
INSAT 2010
Du ct Serveur
Implmentation de la classe qui gre les mthodes de l interface HelloWorld
// Classe d'implmentation du Serveur public class HelloWorldImpl extends UnicastRemoteObject implements HelloWorld { public String sayHello() throws RemoteException { String result = hello world !!! ; System.out.println( Mthode sayHello invoque... + result); return result; } }
34 Application Rparties
INSAT 2010
Classe dimplmentation
Doit implmenter linterface HelloWorld Doit tendre la classe RemoteServer du paquetage java.rmi RemoteServer est une classe abstraite UnicastRemoteObject est une classe concrte qui gre la communication et les stubs
35 Application Rparties
INSAT 2010
Classe dimplmentation
HelloWorld
HelloWorldImpl
36 Application Rparties
INSAT 2010
Loutil RMIC
Outil livr avec le JDK permet de gnrer les stubs
> rmic HelloWorldImpl gnre un fichier HelloWorldImpl_stub.class
rmic doit tre pass pour toutes les classes d'implmentation des Object Distribus afin d'en gnrer les stubs
37 Application Rparties
INSAT 2010
38 Application Rparties
INSAT 2010
On indique quelle est l'adresse de la machine sur laquelle s'excute le RMIRegistry ainsi que la cl La valeur retourne doit tre transtype (caste) vers son type rel
39 Application Rparties
INSAT 2010
Remarque
Le Service de Nommage n'a pas pour fonction le rfrencement de tous les objets de serveur
Il devient vite complexe de grer l'unicit des cls
La rgle de bonne utilisation du Naming est de lier des objets qui font office de point d'entre, et qui permettent de manipuler les autres objets serveurs
40 Application Rparties
INSAT 2010
41 Application Rparties
INSAT 2010
42 Application Rparties
INSAT 2010
43 Application Rparties
INSAT 2010
Serveur suite
Apres avoir compil le tout... Pour dmarrer le serveur, il faut tout d'abord lancer le RMIRegistry
Attention : La base de registres RMI doit connatre les interfaces et les stubs des objets qu'elle enregistre (CLASSPATH) !!!
45 Application Rparties
INSAT 2010
47 Application Rparties
INSAT 2010
Client suite
Il suffit ensuite de lancer le programme > java HelloWorldClient
Recherche de l'objet serveur... Invocation de la mthode sayHello... Affichage du rsultat : hello world !!!
Au niveau du serveur, le message... Mthode sayHello invoque... hello world !!! ...s'affichera dans la console
48 Application Rparties
INSAT 2010
49 Application Rparties
INSAT 2010
50 Application Rparties
INSAT 2010
51 Application Rparties
INSAT 2010
Chargement dynamique
Pour ne plus dployer les classes du serveur chez le client
Utilisation des chargeurs de classes qui tlchargent des classes depuis une URL Utilisation dun serveur Web qui fournit les classes
Ce que a change
Bien entendu, les classes et interfaces de lobjet distant ne changent pas Le code du serveur ne change pas
le client et la faon de le dmarrer sont modifis Et lancer un serveur Web pour nos classes
52 Application Rparties
INSAT 2010
53 Application Rparties
INSAT 2010
54 Application Rparties
INSAT 2010
55 Application Rparties
INSAT 2010
57 Application Rparties
INSAT 2010
Le client doit bien connatre l'emplacement des classes afin de pouvoir les tlcharger
On va le lui prciser lors du lancement
java -Djava.security.policy=client.policy -D java.rmi.server.codebase=http://www.class-server.com:80/ HelloWorldClient
58 Application Rparties
INSAT 2010
Le stub est accessible au serveur MAIS PAS AU rmiregistry Attention lordre dappel : gnration des stubs et appel du rmiregistry
rmiregistry dj lanc
java.rmi.server.ExportException: Port already in use: 1099
60 Application Rparties
INSAT 2010
Client
Registry registry; registry = LocateRegistry.getRegistry(); Hello hello = (Hello) registry.lookup("coucou");
Serveur
LocateRegistry.createRegistry(port); // port=1099
61 Application Rparties
INSAT 2010