50
1 RMI - CNAM [email protected] Objets Distribués Objets Distribués Java et les appels de méthodes distantes Java et les appels de méthodes distantes Remote Method Invocation (RMI) Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître de Conférences en Informatique Laboratoire CEDRIC CNAM

RMI - CNAM [email protected] 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

Embed Size (px)

Citation preview

Page 1: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

1RMI - CNAM

[email protected]

Objets DistribuésObjets DistribuésJava et les appels de méthodes distantesJava et les appels de méthodes distantes

Remote Method Invocation (RMI)Remote Method Invocation (RMI)

Samia Saad-BouzefraneMaître de Conférences en Informatique

Laboratoire CEDRIC

CNAM

Page 2: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

2RMI - CNAM

[email protected]

Références bibliographiquesRéférences bibliographiques

• 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

Page 3: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

3RMI - CNAM

[email protected]

public interface ReverseInterface {String reverseString(String chaine);}

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

} }

Appel local : interface et objetAppel local : interface et objet

Page 4: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

4RMI - CNAM

[email protected]

import ReverseInterface;

public class ReverseClient{ public static void main (String [] args) { Reverse rev = new Reverse(); String result = rev.reverseString (args [0]); System.out.println ("L'inverse de "+args[0]+" est "+result); }}

$javac *.java$java ReverseClient AliceL’inverse de Alice est ecilA$

Appel local : programme appelant l’objetAppel local : programme appelant l’objet

Page 5: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

5RMI - CNAM

[email protected]

Qu’attend t-on d’un objet distribué ?Qu’attend t-on d’un objet distribué ?

Un objet distribué doit pouvoir être vu comme un objet « normal ».

Soit la déclaration suivante :

ObjetDistribue monObjetDistribue;

• On doit pouvoir invoquer une méthode de cet objet situé sur une autre machine de la même façon qu’un objet local :

monObjetDisribue.uneMethodeDeLOD();

Page 6: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

6RMI - CNAM

[email protected]

• On doit pouvoir utiliser cet objet distribué sans connaître sa localisation. On utilise pour cela un service sorte d’annuaire,qui doit nous renvoyer son adresse.

monObjetDistribue=ServiceDeNoms.recherche(‘myDistributedObject’);

• On doit pouvoir utiliser un objet distribué comme paramètred’une méthode locale ou distante. 

x=monObjetLocal.uneMethodeDeLOL(monObjetDistribue);

x= monObjetDistribue.uneMethodeDeLOD(autreObjetDistribue);

Page 7: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

7RMI - CNAM

[email protected]

• On doit pouvoir récupérer le résultat d’un appel de méthode sous la forme d’un objet distribué.

monObjetDistribue=autreObjetDistribue.uneMethodeDeLOD();

monObjetDistribue=monObjetLocal.uneMethodeDeLOL();

Page 8: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

8RMI - CNAM

[email protected]

Java RMIJava RMIRemote Method InvocationRemote Method Invocation

permet la communication entre machines virtuelles Java (JVM)qui peuvent se trouver physiquement sur la même machineou sur deux machines distinctes.

Page 9: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

9RMI - CNAM

[email protected]

PrésentationPrésentation

RMI est un système d’objets distribués constitué uniquement d’objets java ;

• RMI est une Application Programming Interface (intégrée au JDK 1.1 et plus) ;

• Développé par JavaSoft ;

Page 10: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

10RMI - CNAM

[email protected]

• Mécanisme qui permet l’appel de méthodes entre objets Java qui s’exécutent éventuellement sur des JVM distinctes ;

• L ’appel peut se faire sur la même machine ou bien sur des machines connectées sur un réseau ;

• Utilise les sockets ;

• Les échanges respectent un protocole propriétaire :Remote Method Protocol ;

• RMI repose sur les classes de sérialisation.

Page 11: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

11RMI - CNAM

[email protected]

ArchitectureArchitecture

Invocation de la méthode distante

Stub

Couche référencesdistantes

TCP/IP

Interface Hard

Objet distant

Squelette

Couche référencesdistantes

TCP/IP

Interface Hard

Application

Présentation

Session

Transport/réseau

Liaison de données /Physique

Page 12: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

12RMI - CNAM

[email protected]

Appel local versus Appel à distanceAppel local versus Appel à distance

Client interface Objet Appel local

Client interface Objetinterface interfaceStub Skeleton

Réseau

méthode+ arguments

retour + exceptionAppel distant

Page 13: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

13RMI - CNAM

[email protected]

Les amorces (Stub/SkeletonLes amorces (Stub/Skeleton))

• Elles assurent le rôle d’adaptateurs pour le transport des appels distants

• Elles réalisent les appels sur la couche réseau

• Elles réalisent l’assemblage et le désassemblage des paramètres (marshalling, unmarshalling)

• Une référence d’objets distribué correspond à une référenced’amorce

• Les amorces sont créées par le générateur rmic.

Page 14: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

14RMI - CNAM

[email protected]

Les StubsLes Stubs

• Représentants locaux de l’objet distribué ;

• Initient une connexion avec la JVM distante en transmettantl’invocation distante à la couche des références d’objets ;

• Assemblent les paramètres pour leur transfert à la JVM distante ;

• Attendent les résultats de l’invocation distante ;

• Désassemblent la valeur ou l’exception renvoyée ;

• Renvoient la valeur à l’appelant ;

• S’appuient sur la sérialisation.

Page 15: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

15RMI - CNAM

[email protected]

Les squelettesLes squelettes

• Désassemblent les paramètres pour la méthode distante ;

• Font appel à la méthode demandée ;

• Assemblage du résultat (valeur renvoyée ou exception) à destination de l’appelant.

Page 16: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

16RMI - CNAM

[email protected]

La couche des références d’objetsLa couche des références d’objetsRemote Reference LayerRemote Reference Layer

• Permet d ’obtenir une référence d’objet distribué à partir de la référence locale au stub ;

• Cette fonction est assurée grâce à un service de noms rmiregister (qui possède une table de hachage dont les clés sont des noms et les valeurs sont des objets distants) ;

• Un unique rmiregister par JVM ;

• rmiregister s ’exécute sur chaque machine hébergeant des objets distants ;

•rmiregister accepte des demandes de service sur le port 1099;

Page 17: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

17RMI - CNAM

[email protected]

La couche transportLa couche transport

• réalise les connexions réseau basées sur les flux entre les JVM

•emploie un protocole de communication propriétaire (JRMP:Java Remote Method Invocation) basé sur TCP/IP •Le protocole JRMP a été modifié afin de supprimer la nécessité des squelettes car depuis la version 1.2 de Java, une même classeskeleton générique est partagée par tous les objets distants.

Page 18: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

18RMI - CNAM

[email protected]

Etapes d’un appel de méthode distanteEtapes d’un appel de méthode distante

Stub

Ser

veur

d’o

bjet

s

Ske

leto

n

Objet distant

App

lica

t ion

Cli

ente

Serveur de noms

Client Serveur

1. Exposer

2. Publier 3. Interroger

4. Récupérer

5. Appel de méthode

10. Retour

7. Appel méthode

8. Retour

9. Résultat

6. Argumentssérialisation

Page 19: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

19RMI - CNAM

[email protected]

Développer une application avec RMI : Mise en œuvreDévelopper une application avec RMI : Mise en œuvre

1. Définir une interface distante (Xyy.java) ;

2. Créer une classe implémentant cette interface (XyyImpl.java) ;

3. Compiler cette classe (javac XyyImpl.java) ;

4. Créer une application serveur (XyyServer.java) ;

5. Compiler l’application serveur ;

6. Créer les classes stub et skeleton à l’aide de rmic XyyImpl_Stub.java et XyyImpl_Skel.java (Skel n’existe pas pour les versions >1.2) ;

7. Démarrage du registre avec rmiregistry ;

8. Lancer le serveur pour la création d’objets et leur enregistrement dans rmiregistry;

9. Créer une classe cliente qui appelle des méthodes distantes de l’objet distribué (XyyClient.java) ;10. Compiler cette classe et la lancer.

Page 20: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

20RMI - CNAM

[email protected]

Inversion d’une chaîne de caractères Inversion d’une chaîne de caractères à l’aide d’un objet distribuéà l’aide d’un objet distribué

Invocation distante de la méthode reverseString() d’un objetdistribué qui inverse une chaîne de caractères fournie par l’appelant.

On définit :• ReverseInterface.java : interface qui décrit l’objet distribué

• Reverse.java : qui implémente l’objet distribué

• ReverseServer.java : le serveur RMI

• ReverseClient.java : le client qui utilise l’objet distribué

Page 21: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

21RMI - CNAM

[email protected]

Côté Client Côté Serveur

- l’interface : ReverseInterface- le client : ReverseClient

Fichiers nécessaires

- l’interface : ReverseInterface- l’objet : Reverse- le serveur d’objets : ReverseServer

Page 22: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

22RMI - CNAM

[email protected]

Interface de l’objet distribuéInterface de l’objet distribué

- Elle est partagée par le client et le serveur ;

- Elle décrit les caractéristiques de l’objet ;

- Elle étend l’interface Remote définie dans java.rmi. Toutes les méthodes de cette interface peuvent déclencher une exception du type RemoteException.

Cette exception est levée :- si connexion refusée à l’hôte distant- ou bien si l’objet n’existe plus,- ou encore s’il y a un problème lors de l’assemblage ou le désassemblage.

Page 23: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

23RMI - CNAM

[email protected]

Interface de la classe distanteInterface de la classe distante

import java.rmi.Remote;import java.rmi.RemoteException;

public interface ReverseInterface extends Remote {String reverseString(String chaine) throws RemoteException;}

Page 24: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

24RMI - CNAM

[email protected]

Implémentation de l’objet distribuéImplémentation de l’objet distribué

• L’implémentation doit étendre la classe RemoteServer de java.rmi.server

• RemoteServer est une classe abstraite

• UnicastRemoteObject étend RemoteServer

- c’est une classe concrète

- une instance de cette classe réside sur un serveuret est disponible via le protocole TCP/IP

Page 25: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

25RMI - CNAM

[email protected]

Implémentation de l’objet distribuéImplémentation de l’objet distribué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();} }

Page 26: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

26RMI - CNAM

[email protected]

Le serveurLe serveur

• Programme à l’écoute des clients ;

• Enregistre l’objet distribué dans rmiregistryNaming.rebind("rmi://hote.cnam.fr:1099/Reverse", rev);

• On installe un gestionnaire de sécurité si le serveur est amené à charger des classes (inutile si les classes ne sont pas chargées dynamiquement)System.setSecurityManager(new RMISecurityManager());

Page 27: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

27RMI - CNAM

[email protected]

Le serveurLe serveur

import java.rmi.*;import java.rmi.server.*;

public class ReverseServer {public static void main(String[] args) { try { System.out.println( "Serveur : Construction de l’implémentation "); 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

Page 28: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

28RMI - CNAM

[email protected]

Le ClientLe Client

• Le client obtient un stub pour accéder à l’objet 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 numéro de port optionnel et le nom de l’objet distant.

rmi://hote:2110/nomObjet

Par défaut, le numéro de port est 1099 défini (ou à définir) dans/etc/services :

rmi 1099/tcp

Page 29: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

29RMI - CNAM

[email protected]

Le ClientLe Client

• Installe un gestionnaire de sécurité pour contrôler les stubschargés dynamiquement :

System.setSecurityManager(new RMISecurityManager());

• Obtient une référence d’objet distribué :

ReverseInterface ri = (ReverseInterface) Naming.lookup("rmi://sinus.cnam.fr:1099/MyReverse");

• Exécute une méthode de l’objet :

String result = ri.reverseString ("Terre");

Page 30: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

30RMI - CNAM

[email protected]

Le ClientLe 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'accès à l'objet distant."); System.out.println (e.toString()); } }

}

Page 31: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

31RMI - CNAM

[email protected]

Le ClientLe Client

Pour que le client puisse se connecter à rmiregistry, il faut luifournir un fichier de règles de sécurité client.policy.$more client.policygrant{permission java.net.SocketPermission ":1024-65535",  "connect" ;permission java.net.SocketPermission ":80",  "connect";};

$more client1.policygrant{permission java.security.AllPermission;};

Page 32: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

32RMI - CNAM

[email protected]

Compilation et ExécutionCompilation et Exécution

- Compiler les sources (interface, implémentation de l’objet, le serveur et le client ) :

sinus> javac *.java

- Lancer rmic sur la classe d’implémentation :

sinus>rmic -v1.2 Reversesinus>transférer *Stub.class et ReverseInterface.class vers la machine cosinus

- Démarrer rmiregistry :

sinus>rmiregistry -J-Djava.security.policy=client1.policy&

Page 33: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

33RMI - CNAM

[email protected]

- Lancer le serveur :sinus>java ReverseServer &Serveur :Construction de l’implémentationObjet Reverse lié dans le RMIregistryAttente des invocations des clients …

- Exécuter le client :cosinus>java -Djava.security.policy=client1.policy ReverseClientLille

L'inverse de Alice est ecilA

Page 34: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

34RMI - CNAM

[email protected]

Charger des classes de manière dynamique Charger des classes de manière dynamique

- Les définitions de classe sont hébergées sur un serveur Web ;

- Les paramètres, les stubs sont envoyés au client via une connexion au serveur Web;

- Pour fonctionner, une application doit télécharger les fichiersde classe.

Chargement dynamique

- évite de disposer localement de toutes les définitions de classe ;- les mêmes fichiers de classe (même version) sont partagés par tous les clients- charge une classe au besoin.

Page 35: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

35RMI - CNAM

[email protected]

Côté Client Côté Serveur

- l’interface : ReverseInterface- le stub : Reverse_Stub- le client : ReverseClient

Fichiers nécessaires si pas de chargement dynamique

- l’interface : ReverseInterface- l’objet : Reverse- le serveur d’objets : ReverseServer

Page 36: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

36RMI - CNAM

[email protected]

Côté Client Côté Serveur

le client : ReverseClient

Fichiers nécessaires si chargement dynamique

le serveur d’objets : ReverseServer

Serveur Web- Interface : ReverseInterface- Stub : Reverse_Stub- l’objet : Reverse

Récupérer les fichiersde classe à partir du serveur Web

Page 37: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

37RMI - CNAM

[email protected]

Côté Client Côté Serveur

le client : DynamicClient

Le client peut être lui même dynamique

le serveur d’objets : ReverseServer

Serveur Web- Interface : ReverseInterface-l’objet : Reverse- Stub : Reverse_Stub- le client : ReverseClient

Récupérer les fichiersde classe à partir du serveur Web

Page 38: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

38RMI - CNAM

[email protected]

Côté Client Côté Serveur

Le client : DynamicClient-Chargement dynamique du client et de l’interface à partir d’un répertoirelocal. Si non disponibles localement, ils sont recherchés sur le serveur Webspécifié.-L’exécution de ReverseClient permet d’obtenir la référence de l’objet Reverse et l’appel distant de

sa méthode.

Le client peut être lui même dynamique

Le serveur d’objets : ReverseServer-Chargement dynamique de l’objet Reverse à partir du serveur Web- Enregistrement de l’objet dans RMIregistry (bind)- Attente de requêtes des clients

Serveur Web

- Interface : ReverseInterface-l’objet : Reverse-Stub : Reverse_Stub- le client : ReverseClient

Page 39: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

39RMI - CNAM

[email protected]

Deux propriétés systèmes dans RMIDeux propriétés systèmes dans RMI

java.rmi.server.codebase : spécifie l ’URL (file://, ftp://, http://) où peuvent se trouver les classes.Lorsque RMI sérialise l’objet (envoyé comme paramètre ou reçu comme résultat), il rajoute l’URL spécifiée par codebase.

java.rmi.server.useCodebaseOnly : informe le client que le chargement de classes est fait uniquement à partir du répertoire du codebase.

Page 40: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

40RMI - CNAM

[email protected]

Principe du chargement dynamiquePrincipe du chargement dynamique

A l’enregistrement (dans rmiregistry) de l ’objet distant, le codebase est spécifié par java.rmi.server.codebase.

A l’appel de bind(), le registre utilise ce codebase pour trouver les fichiers de classe associés à l’objet.

Le client recherche la définition de classe du stub dans son classpath. S’il ne la trouve pas, il essayera de la récupérer à partir du codebase.

Une fois que toutes les définitions de classe sont disponibles, la méthode proxy du stub appelle les objets sur le serveur.

Page 41: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

41RMI - CNAM

[email protected]

- Les classes java.rmi.RMISecurityManager et java.rmi.server.RMIClassLoader vérifient le contexte de sécurité avant de charger des classes à partir d’emplacements distants.

- La méthode LoadClass de RMIClassLoader charge la classe à partir du codebase spécifié.

Sécurité lors d’un chargement dynamiqueSécurité lors d’un chargement dynamique

Page 42: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

42RMI - CNAM

[email protected]

-Écrire les classes correspondant respectivement à l’interface et à l’objet.-Les compiler.-Générer le Stub correspondant à l’objet.-Installer tous les fichiers de classe sur un serveur Web.-Écrire le serveur dynamique.-Installer rmiregistry au niveau de la machine du serveur.-Lancer le serveur en lui précisant l’URL des fichiers de classe afin qu’il puisse charger dynamiquement le fichier de classe correspondant à l’objet, l’instancier (le créer) et l’enregistrer auprès de rmiregistry.

-Sur la machine du client, écrire le code du client. -Compiler le client statique et l’installer éventuellement sur le site Web.-Compiler le client dynamique et le lancer en précisant l’URL des fichiers de classe.

Les différentes étapes d’un chargement dynamiqueLes différentes étapes d’un chargement dynamique

Page 43: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

43RMI - CNAM

[email protected]

Exemple avec chargement dynamique

// l’interface

import java.rmi.Remote;import java.rmi.RemoteException;

public interface ReverseInterface extends Remote {String reverseString(String chaine) throws RemoteException;}

Page 44: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

44RMI - CNAM

[email protected]

L’objet 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();} }

Page 45: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

45RMI - CNAM

[email protected]

Le serveur dynamique :import java.rmi.Naming;import java.rmi.Remote;import java.rmi.RMISecurityManager;import java.rmi.server.RMIClassLoader;import 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());

Page 46: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

46RMI - CNAM

[email protected]

Suite du serveur dynamique :System.out.println("Objet Reverse lié dans le

RMIregistry"); 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

Page 47: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

47RMI - CNAM

[email protected]

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'accès à l'objet distant "); System.out.println (e.toString()); } }

}

Page 48: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

48RMI - CNAM

[email protected]

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});}// vérifier le passage de paramètres

Page 49: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

49RMI - CNAM

[email protected]

Suite du client dynamique :

public static void main (String [] args) { System.setSecurityManager(new RMISecurityManager()); try{ DynamicClient cli = new DynamicClient() ; } catch (Exception e) { System.out.println (e.toString()); } }}

Page 50: RMI - CNAM samia.bouzefrane@cnam.fr 1 Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître

50RMI - CNAM

[email protected]

sinus> lsReverse.java ReverseInterface.java DynamicServer.javasinus> javac *.javasinus> rmic -v1.2 Reversesinus> mv Reverse*.class /var/www/html/samia/rmi Le répertoire destination des fichiers de classe doit être accessible par http.sinus> ls *.classDynamicServer.classsinus>rmiregistry -J-Djava.security.policy=client1.policy &sinus>java -Djava.security.policy=client1.policy -Djava.rmi.server.codebase=http://sinus.cnam.fr/samia/rmi DynamicServerObjet liéAttente des invocations des clients …----------------------------------cosinus>ls *.javaReverseClient.java DynamicClient.javacosinus>javac *.javacosinus>java -Djava.security.policy=client1.policy -Djava.rmi.server.codebase=http://sinus.cnam.fr/samia/rmi DynamicClientL’inverse de Alice est ecilAcosinus>Le chargement de ReverseClient se fera à partir du répertoire local alors que ReverseInterface et Reverse_Stub seront chargés à partir du serveur Web spécifié dans la commande.