Sie sind auf Seite 1von 62

Applications Rparties Java Remote Method Invocation

Atef Ben Ismail

INSAT 2009-2010

Intrt des objets pour la construction dapplications rparties


Encapsulation
Linterface (mthodes + attributs) est la seule voie daccs ltat interne, non directement accessible

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)

Principe : mme schma que RPC


Le programmeur fournit
Une (ou plusieurs) description(s) dinterface Ici pas dIDL spar : Java sert dIDL Le programme du serveur Objets ralisant les interfaces Serveur Le programme du client

Lenvironnement Java fournit


Un gnrateur de talons (rmic) Un service de noms (Object Registry)

voir http://java.sun.com/docs/books/tutorial/rmi/
3 Application Rparties INSAT 2010

RMI est pur Java


Avec RMI, le serveur et le client doivent tre crit en java Le ramasse miettes est distribu sur le rseau
Un objet est dtruit du serveur sil nest plus rfrenc

RMI est une interface de programmation indpendante du protocole


Par dfaut RMI utilise le protocole JRMP (protocole propritaire SUN) RMI fonctionne aussi avec le protocole CORBA: IIOP

4 Application Rparties

INSAT 2010

Fonctionnement de RMI: Serveur


Fonctionnement ct serveur :
1) L'objet serveur s'enregistre auprs du service de noms RMI via la classe Naming de sa JVM (mthode bind ou rebind) 2) L'objet squelette (skeleton) est cr, celui-ci cre le port de communication et maintient une rfrence vers l'objet serveur 3) Le Naming enregistre l'objet serveur, et le port de communication utilis auprs du serveur de noms.

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

5 | A look Forward | January 2010

Fonctionnement de RMI: Client


Fonctionnement ct client :
1) L'objet client fait appel au Naming de sa JVM pour localiser l'objet serveur (mthode lookup) 2) Le Naming rcupre une "rfrence" vers l'objet serveur, 3) Cre l'objet souche et 4) Renvoie la rfrence de la souche au client 5) Le client appelle des mthodes de l'objet serveur au travers de la souche (Stub) et du squelette (skeleton).

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

6 | A look Forward | January 2010

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

7 | A look Forward | January 2010

Enregistrement d'un service

8 | A look Forward | January 2010

Accs une rfrence distante

9 | A look Forward | January 2010

Invocation d'une mthode

10 | A look Forward | January 2010

Architecture gnrale de RMI

11 | A look Forward | January 2010

Quest ce quun Proxy?


Un objet distribu est accd via un Proxy
Le Proxy est lobjet distribu implmentant la mme interface Le Proxy transmet les invocations de mthodes sur le rseau, vers lobjet distribu Lobjet distribu contient le code excuter

Le Stub est la classe dun Proxy

12 Application Rparties

INSAT 2010

Annuaire ou Service de nommage


Obtention d'une premire rfrence sur un objet distant : bootstrap laide dun Service de Nommage ou Annuaire Enregistrement des rfrences d'objets dans l'annuaire afin que des programmes distants puissent les rcuprer

13 | A look Forward | January 2010

Exemple: Le RMIRegistry (1/2)


Implmentation d'un service de nommage Fourni en standard avec RMI Permet d'enregistrer des rfrences sur des objets de serveur afin que des clients les rcuprent On associe la rfrence de l'objet une cl unique (chane de caractres) Le client effectue une recherche par la cl, et le service de nommage lui renvoie la rfrence distante (le stub) de l'objet enregistr pour cette cl

14 | A look Forward | January 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

15 | A look Forward | January 2010

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(...)

Dlier des rfrences d'objets serveur


Naming.unbind(...)

Lister le contenu du Naming


Naming.list(...)

Obtenir une rfrence vers un objet distant


Naming.lookup(...)

16 | A look Forward | January 2010

Java RMI : rgles dusage (1/2)


Interface
Linterface dun objet distant (Remote) est celle dun objet Java, avec quelques rgles dusage : Linterface distante doit tre publique Linterface distante doit tendre linterface java.rmi.Remote Chaque mthode doit dclarer au moins lexception java.rmi.RemoteException

Passage dobjets en paramtre


Les objets locaux sont passs par valeur (copie) et doivent tre srialisables (tendent linterface java.io.Serializable) Les objets distants sont passs par rfrence et sont dsigns par leur interface

17 Application Rparties

INSAT 2010

Java RMI : rgles dusage (2/2)


Ralisation des classes distantes (Remote)
Une classe distante doit implmenter une interface elle-mme distante (Remote) Une classe distante doit tendre la classe java.rmi.server.UnicastRemoteObject Une classe distante peut aussi avoir des mthodes appelables seulement localement (ne font pas partie de son interface Remote)

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

Si classe n'implmente pas Remote : passage par valeur


L'objet est clon, on passe ou rcupre une copie de l'objet

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

19 | A look Forward | January 2010

Java RMI : rgles dcriture du serveur


Un serveur est une classe qui implmente linterface de lobjet distant
Spcifier les rfrences distantes qui doivent tre implmentes (objets passs en paramtres) Dfinir le constructeur de lobjet distant Fournir la ralisation des mthodes appelables distance Crer et installer le gestionnaire de scurit Crer au moins une instance de la classe serveur Enregistrer au moins une instance dans le serveur de noms

20 | A look Forward | January 2010

RMI: Cycle de Dveloppement (1/2)


Dfinition de l'interface de l'objet distant :
interface hritant de java.rmi.Remote mthodes : "throws java.rmi.RemoteException"

Ecrire une implmentation :


classe hritant de java.rmi.server.UnicastRemoteObject et implmentant l'interface prcdente. paramtres de type simple, objets srialisables : "implements Serializable" ou souches crire un main permettant l'enregistrement auprs du Naming

Ecriture d'un client


utilisation du Naming pour trouver l'objet distant appel(s) de mthodes

21 | A look Forward | January 2010

RMI: Cycle de Dveloppement

22 Application Rparties

INSAT 2010

Java RMI : tapes de la mise en uvre (1/2)


Compilation
Sur la machine serveur : compiler les interfaces et les programmes du serveur
javac <Interface>.java <InterfaceImpl>.java <Server>.java

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

Java RMI : tapes de la mise en uvre (2/2)


Excution
Lancer le serveur de noms (sur la machine serveur)
rmiregistry &

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

Exemple HelloWorld Pas Pas

Exemple: Hello World

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

27 | A look Forward | January 2010

Dfinir les packages


Il est prfrable mais pas obligatoire de :
Placer le code du client et du serveur dans des packages diffrents Placer les interfaces distribues dans un troisime package

helloworld

helloworld.client

import

Helloworld.intfc

import

helloworld.server

28 | A look Forward | January 2010

Interfaces et classes prdfinies

29 Application Rparties

INSAT 2010

Interface = protocole d application


L interface HelloWorld

import java.rmi.*; interface HelloWorld extends Remote { public String sayHello() throws RemoteException; }

30 Application Rparties

INSAT 2010

Rle de linterface
HelloWorld

31 | A look Forward | January 2010

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 ...

32 | A look Forward | January 2010

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

Enregistrement d une rfrence


L objet serveur HelloWorld (cot serveur bien entendu) On a cr l'objet serveur et on a une variable qui le rfrence HelloWorld hello = new HelloWorldImpl(); On va enregistrer l'objet dans le RMIRegistry Naming.rebind("HelloWorld",hello); L'objet est dsormais accessible par les clients

38 Application Rparties

INSAT 2010

Obtention d'une rfrence cot client


sur l'objet serveur HelloWorld On dclare une variable de type HelloWorld et on effectue une recherche dans l'annuaire
HelloWorld hello = (HelloWorld)Naming.lookup("rmi://www.helloworldserver.com/HelloWorld");

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

Conception, implmentation et excution de l'exemple


Rappel
On veut invoquer la mthode sayHello() d'un objet de serveur distant de type HelloWorld depuis un programme Java client

Nous allons devoir coder


L'objet distant Le serveur Le client Et dfinir les permissions de scurit et autres emplacements de classes...

41 Application Rparties

INSAT 2010

Hello World : L'objet distant


Une interface et une classe d'implmentation stubs gnrs automatiquement par rmic toutes les classes ncessaires lobjet de client doivent tre dployes sur la machine cliente et accessibles au chargeur de classes (dans le CLASSPATH)
L'interface HelloWorld (HelloWorld.class) Le stub HelloWorldImpl_stub gnr par rmic pour cet objet

42 Application Rparties

INSAT 2010

Hello World : Le serveur


instancie un objet de type HelloWorld et attache au service de nommage puis objet mis en attente des invocations jusqu' ce que le serveur soit arrt

43 Application Rparties

INSAT 2010

Hello World : Le serveur


import java.rmi.*;
import java.rmi.server.*; public class HelloWorldServer { public static void main(String[] args) { try { System.out.println("Cration de l'objet serveur..."); HelloWorld hello = new HelloWorldImpl(); System.out.println("Rfrencement dans le RMIRegistry..."); Naming.rebind("HelloWorld",hello); System.out.println("Attente d'invocations - CTRL-C pour stopper"); } catch(Exception e) { e.printStackTrace(); } } }
44 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) !!!

> rmiregistry & et ensuite on lance le serveur > java HelloWorldServer


cration de l'objet serveur... Rfrencement dans le RMIRegistry... Attente d'invocations - CTRL-C pour stopper

45 Application Rparties

INSAT 2010

Hello World : client


Obtenir une rfrence sur l'objet de serveur HelloWorld, invoquer la mthode sayHello(), puis afficher le rsultat de l'invocation sur la sortie standard

46 | A look Forward | January 2010

Hello World : client


import java.rmi.*; public class HelloWorldClient { public static void main(String[] args) { try { System.out.println("Recherche de l'objet serveur...");

HelloWorld hello = (HelloWorld)Naming.lookup("rmi://server/HelloWorld");


System.out.println("Invocation de la mthode sayHello...");

String result = hello.sayHello();


System.out.println("Affichage du rsultat :"); System.out.println(result); System.exit(0); } catch(Exception e) { e.printStackTrace(); } } }

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

Que doit connatre le client ?


Lorsquun objet serveur est pass un programme, soit comme paramtre soit comme valeur de retour, ce programme doit tre capable de travailler avec le stub associ Le programme client doit connatre la classe du stub les classes des paramtres, des valeurs de retour et des exceptions doivent aussi tre connues...
Une mthode distante est dclare avec un type de valeur de retour... ...mais il se peut que lobjet rellement renvoy soit une sous-classe du type dclar

49 Application Rparties

INSAT 2010

Que doit connatre le client ?


Le client doit disposer des classes de stub, classes des objets retourns
Copier les classes sur le systme de fichiers local du client (CLASSPATH)... ...cependant, si le serveur est mis jour et que de nouvelles classes apparaissent, il devient vite pnible de mettre jour le client Cest pourquoi les clients RMI peuvent charger automatiquement des classes de stub depuis un autre emplacement
Il s agit du mme type de mcanisme pour les applets qui fonctionnent dans un navigateur

50 Application Rparties

INSAT 2010

Chargement dynamique des classes


Problme de scurit
Le programme client tlcharge du code sur le rseau Ce code pourrait contenir des virus ou effectuer des oprations non attendues !!! Utilisation d un gestionnaire de scurit pour les applications de clients RMI Possibilit de crer des gestionnaires de scurit personnaliss pour des applications spcifiques RMI fournit des gestionnaires de scurit suffisants pour un usage classique

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

Hello World : chargement dynamique


Sparation des classes Serveur (fichiers ncessaires a l'excution du serveur)
HelloWorldServer.class HelloWorldImpl.class HelloWorld.class HelloWorldImpl_Stub.class

Download (fichiers de classes charger dans le programme client)


HelloWorldImpl_Stub.class

Client (fichiers ncessaires au dmarrage du client)


HelloWorld.class HelloWorldClient.class

53 Application Rparties

INSAT 2010

Hello World : Dmarrage du serveur Web


Mettre les classes Download dans le rpertoire des documents Web du serveur Web, accessibles via une URL le chargeur de classes ira chercher les classes un emplacement de type
http://www.class-server.com/classes/HelloWorldImpl_Stub.class

54 Application Rparties

INSAT 2010

Hello World : Politiques de scurit


Le programme Java client doit pouvoir se connecter aux ports de la base de registres RMI et des implmentations des objets de serveur, ainsi qu'au port du serveur Web Fichier client.policy
grant { permission java.net.SocketPermission "*:1024-65535", "connect,resolve"; permission java.net.SocketPermission "*:80", "connect"; };

55 Application Rparties

INSAT 2010

Hello World : gestionnaire de scurit RMI


Le client intgre un gestionnaire de scurit RMI pour les stubs tlchargs dynamiquement
import java.rmi.*; import java.rmi.server.*; public class HelloWorldClient { public static void main(String[] args) { try { // Installe un gestionnaire de scurit RMI System.setSecurityManager(new RMISecurityManager()); System.out.println("Recherche de l'objet serveur..."); HelloWorld hello = (HelloWorld)Naming.lookup("rmi://server/HelloWorld"); System.out.println("Invocation de la mthode sayHello..."); String result = hello.sayHello(); System.out.println("Affichage du rsultat :"); System.out.println(result); } catch(Exception e) { e.printStackTrace(); } } }
56 Application Rparties INSAT 2010

Hello World : Dmarrage cot serveur


1. Lancer la base de registres RMI (elle doit pouvoir accder aux classes Download - CLASSPATH) > rmiregistry 2. Lancer le serveur Web servant les fichiers de classes Download 3. Lancer le serveur (les classes Server doivent tre accessibles)
> java HelloWorldServer Cration de l'objet serveur... Rfrencement dans le RMIRegistry... Attente d'invocations - CTRL-C pour stopper

57 Application Rparties

INSAT 2010

Hello World : Dmarrage cot client


Le client doit pouvoir se connecter des machines distantes pour la base de registres RMI, les objets de serveur ainsi que le serveur Web
On doit lui fournir un fichier client.policy

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

Erreurs classiques (1/2)


Stub inaccessible au rmiregistry
java.rmi.ServerException: RemoteException occurred in server ... java.rmi.UnmarshalException: error unmarshalling ... java.lang.ClassNotFoundException:

Le stub est accessible au serveur MAIS PAS AU rmiregistry Attention lordre dappel : gnration des stubs et appel du rmiregistry

rmiregistry pas lanc


java.net.ConnectException

Oubli du constructeur pour le RemoteObject


unreported exception java.rmi.RemoteException in default constructorpublic class HelloImpl extends UnicastRemoteObject implements Hello { ^

rmiregistry dj lanc
java.rmi.server.ExportException: Port already in use: 1099

On peut lancer un autre registry mais sur un autre port.


59 Application Rparties INSAT 2010

Erreurs classiques (2/2)


La classe dimplmentation n'hrite pas de UnicastRemoteObject
S'il n'hrite pas de UnicastRemoteObject, il n'est pas Remote donc on lui demande d'tre Serializable ... Trouble:
java.rmi.MarshalException: error marshalling arguments; nested exception Is: java.io.NotSerializableException: CalculatorImpl

60 Application Rparties

INSAT 2010

Une autre utilisation du rmiRegistry


import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry;

Client
Registry registry; registry = LocateRegistry.getRegistry(); Hello hello = (Hello) registry.lookup("coucou");

Serveur
LocateRegistry.createRegistry(port); // port=1099

Hello stub = (Hello) UnicastRemoteObject.exportObject(unHello, 0); Naming.rebind("rmi://"+"localhost"+":"+ port +"/coucou", stub);

61 Application Rparties

INSAT 2010

www.alcatel-lucent.com INSAT 2009-2010

62 | A look Forward | January 2010

Das könnte Ihnen auch gefallen