63
 Applications Réparties  ava emote et o nvocat on INSAT 2009-2010 Atef Ben Ismail

Cours JAVA RMI

Embed Size (px)

Citation preview

Page 1: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 1/62

Applications Réparties

 ava emote et o nvocat on

INSAT 2009-2010

Atef Ben Ismail

Page 2: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 2/62

Intérêt des objets pour la construction d’applicationsréparties

Encapsulation

• L’interface (méthodes + attributs) est la seule voie d’accès à l’état interne, nondirectement accessible

Classes et instances

• Mécanismes de génération d’exemplaires conformes à un même Modèle

Héritage

2 Application Réparties INSAT 2010

• Mécanisme de spécialisation : facilite récupération et réutilisation de l’existant Polymorphisme

• Mises en œuvre diverses des fonctions d’une interface

• Remplacement d’un objet par un autre si interfaces

• Facilite l’évolution et l’adaptation des applications

Page 3: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 3/62

Java RMI

Motivation : construction d’applications réparties avec Java

• Appel de méthode au lieu d’appel de procédure

• Invocation des méthodes sur des objets s’exécutant sur une autre JVM (même

ordinateur ou sur un autre ordinateur du réseau) Principe : même schéma que RPC

• Le programmeur fournit

’ 

3 Application Réparties INSAT 2010

 

 – Ici pas d’IDL séparé : Java sert d’IDL Le programme du serveur

 – Objets réalisant les interfaces

 – Serveur

Le programme du client

• L’environnement Java fournit– Un générateur de talons (rmic)

– Un service de noms (Object Registry)

voir http://java.sun.com/docs/books/tutorial/rmi/

Page 4: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 4/62

RMI est pur Java

Avec RMI, le serveur et le client doivent être écrit en java

Le ramasse miettes est distribué sur le réseau

Un objet est détruit du serveur s’il n’est plus référencé RMI est une interface de programmation indépendante du protocole

Par défaut RMI utilise le protocole JRMP (protocole propriétaire SUN)

4 Application Réparties INSAT 2010

Page 5: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 5/62

Fonctionnement côté serveur :

1) L'objet serveur s'enregistre auprès du service de noms RMI via la classe Naming de saJVM (méthode bind ou rebind)

2) L'objet squelette (skeleton) est créé, celui-ci crée le port de communication etmaintient une référence vers l'objet serveur

3) Le Naming enregistre l'objet serveur, et le port de communication utilisé auprès duserveur de noms.

Fonctionnement de RMI: Serveur

e e on

• Invoque des méthodes sur l'objet local référencé pour le compte d'une souche

• Convertit les valeurs de retour en un format transmissible via le réseau (marshalling)

• Reconstruit les arguments à partir de données reçues par le réseau (unmarshalling)

• Il n‘est plus indispensable depuis le JDK 1.2

5 | A look Forward | January 2010

Implémentation

Invocation méthode

réponseStub Skeleton

Page 6: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 6/62

Fonctionnement côté client :

1) L'objet client fait appel au Naming de sa JVM pour localiser l'objet serveur (méthodelookup)

2) Le Naming récupère une "référence" vers l'objet serveur, …

3) Crée l'objet souche et …

4) Renvoie la référence de la souche au client

5) Le client appelle des méthodes de l'objet serveur au travers de la souche (Stub) et du

Fonctionnement de RMI: Client

.

Stub

• Représente un objet distant

• Convertit les arguments en un format transmissible via le réseau (marshalling)

• Reconstruit les valeurs de retour à partir de données reçues par le réseau (unmarshalling)

6 | A look Forward | January 2010

Objet Client

Invocation méthode

réponseSkeletonStub

Page 7: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 7/62

Lorsqu'un objet instancié sur une machine cliente désire accèder à desméthodes d'un objet distant, il effectue les opérations suivantes :

• il localise l'objet distant grâce à un service de nommage: le registre RMI

• il obtient dynamiquement une image virtuelle de l'objet distant (appelée stub ousouche en français). Le stub possède exactement la même interface que l'objetdistant.

• Le stub transforme l'appel de la méthode distante en une suite d'octets, c'est ce que

Fonctionnement de RMI

l'on appelle la sérialisation, puis les transmet au serveur instanciant l'objet sous formede flot de données. On dit que le stub "marshalise" les arguments de la méthodedistante.

• Le squelette instancié sur le serveur "désérialise" les données envoyées par le stub (ondit qu'il les "démarshalise"), puis appelle la méthode en local

• Le squelette récupère les données renvoyées par la méthode (type de base, objet ouexception) puis les marshalise

• le stub démarshalise les données provenant du squelette et les transmet à l'objetfaisant l'appel de méthode à distance

7 | A look Forward | January 2010

Page 8: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 8/62

Enregistrement d'un service

8 | A look Forward | January 2010

Page 9: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 9/62

Accès à une référence distante

9 | A look Forward | January 2010

Page 10: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 10/62

Invocation d'une méthode

10 | A look Forward | January 2010

Page 11: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 11/62

Architecture générale de RMI

11 | A look Forward | January 2010

Page 12: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 12/62

Un objet distribué est accédé via un Proxy

Le Proxy est l’objet distribué implémentant la même interface

Le Proxy transmet les invocations de méthodes sur le réseau, vers l’objet distribué

L’objet distribué contient le code à exécuter

Le Stub est la classe d’un Proxy

Qu’est ce qu’un Proxy?

12 Application Réparties INSAT 2010

Page 13: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 13/62

Obtention d'une première référence sur un objet distant : « bootstrap » àl’aide d’un Service de Nommage ou Annuaire

Enregistrement des références d'objets dans l'annuaire afin que des

programmes distants puissent les récupérer

Annuaire ou Service de nommage

13 | A look Forward | January 2010

Page 14: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 14/62

Implémentation d'un service de nommage

Fourni en standard avec RMI

Permet d'enregistrer des références sur des objets de serveur afin que desclients les récupèrent

On associe la référence de l'objet à une clé unique (chaîne de caractères)

 

Exemple: Le RMIRegistry (1/2)

,

renvoie la référence distante (le stub) de l'objet enregistré pour cette clé

14 | A look Forward | January 2010

Page 15: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 15/62

Programme exécutable fourni pour toutes les plates formes

S'exécute sur un port (1099 par défaut) sur la machine serveur

Pour des raisons de sécurité, seuls les objets résidant sur la même machinesont autorisés à lier/délier des références

Un service de nommage est lui-même localisé à l'aide d'une URL

Le RMIRegistry (2/2)

15 | A look Forward | January 2010

Page 16: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 16/62

permet de manipuler le RMIRegistry

supporte des méthodes statiques permettant de

• Lier des références d'objets serveur– Naming.bind(...) et Naming.rebind(...)

• Délier des références d'objets serveur

– Naming.unbind(...)

 

La classe java.rmi.Naming

 

– Naming.list(...)

• Obtenir une référence vers un objet distant

– Naming.lookup(...)

16 | A look Forward | January 2010

Page 17: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 17/62

Interface

• L’interface d’un objet distant (Remote) est celle d’un objet Java, avec quelques règlesd’usage :

• L’interface distante doit être publique• L’interface distante doit étendre l’interface java.rmi.Remote

• Chaque méthode doit déclarer au moins l’exception java.rmi.RemoteException

Java RMI : règles d’usage (1/2)

 

• Les objets locaux sont passés par valeur (copie) et doivent être sérialisables (étendentl’interface java.io.Serializable)

• Les objets distants sont passés par référence et sont désignés par leur interface

17 Application Réparties INSAT 2010

Page 18: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 18/62

Réalisation des classes distantes (Remote)

• Une classe distante doit implémenter une interface elle-même distante (Remote)

• Une classe distante doit étendre la classe java.rmi.server.UnicastRemoteObject

• Une classe distante peut aussi avoir des méthodes appelables seulement localement(ne font pas partie de son interface Remote)

Java RMI : règles d’usage (2/2)

18 Application Réparties INSAT 2010

Page 19: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 19/62

Lors d'appel de méthodes distantes : 4 cas pour gérer les paramètres ou lavaleur retournée selon la classe du paramètre

• Si classe implémente Remote : passage par adresse

On passe ou récupère la référence sur un objet distant

• Si classe n'implémente pas Remote : passage par valeur

L'objet est cloné, on passe ou récupère une copie de l'objet

• Pour types primitifs : passage par valeur également

Passage de paramètres/données

• Si classe n'implémente pas Serializable : objet ne peut pas être paramètre ou la classene peut pas être un type de retour

Les paramètres ou valeurs de retour sont forcément sérialisés pour êtretransmis via le réseau

19 | A look Forward | January 2010

Page 20: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 20/62

Un serveur est une classe qui implémente l’interface de l’objet distant

• Spécifier les références distantes qui doivent être implémentées (objets passés enparamètres)

• Définir le constructeur de l’objet distant• Fournir la réalisation des méthodes appelables à distance

• Créer et installer le gestionnaire de sécurité

 

Java RMI : règles d’écriture du serveur

 

• Enregistrer au moins une instance dans le serveur de noms

20 | A look Forward | January 2010

Page 21: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 21/62

Définition de l'interface de l'objet distant :

• interface héritant de java.rmi.Remote

• méthodes : "throws java.rmi.RemoteException"

Ecrire une implémentation :

• classe héritant de java.rmi.server.UnicastRemoteObject et implémentant l'interfaceprécédente.

 

RMI: Cycle de Développement (1/2)

• paramètres de type simple, objets sérialisables : "implements Serializable" ou souches

• écrire un main permettant l'enregistrement auprès du Naming

Ecriture d'un client

• utilisation du Naming pour trouver l'objet distant

• appel(s) de méthodes

21 | A look Forward | January 2010

Page 22: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 22/62

RMI: Cycle de Développement

22 Application Réparties INSAT 2010

Page 23: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 23/62

Compilation

• Sur la machine serveur : compiler les interfaces et les programmes du serveur

 javac <Interface>.java <InterfaceImpl>.java <Server>.java

• Sur la machine serveur : créer les talons client et serveur pour les objets appelés à

distance (à partir de leurs interfaces) - ici une seule classe, Hellormic –keep <InterfaceImpl>

N.B. cette commande construit et compile les talons client <InterfaceImpl>_Stub.java etserveur <InterfaceImpl>_Skel.java. L’option -keep permet de garder les sources de ces

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

ta ons

• Sur la machine client : compiler les interfaces et le programme client

 javac <Interface>.java <Client>.java

N.B. il est préférable de regrouper dans un fichier .jar les interfaces des objets appelésà distance, ce qui permet de les réutiliser pour le serveur et le client -

23 Application Réparties INSAT 2010

Page 24: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 24/62

Exécution

• Lancer le serveur de noms (sur la machine serveur)

rmiregistry &

N.B. Par défaut, le registry écoute sur le port 1099. Si on veut le placer sur un autre port, il suffit del’indiquer, mais il faut aussi modifier les URL en conséquence :

rmi://<serveur>:<port>/<répertoire>

• Lancer le serveur

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

 java -Djava.rmi.server.codebase=http://<addresse>/<répertoire des classes> -D

 java.security.policy=java.policy <Server> &

N.B. Signification des propriétés (option -D) :

– Le contenu du fichier java.policy spécifie la politique de sécurité.

– L’URL donnée 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, spécifié dans l’option codebase lors du

lancement du serveur

24 Application Réparties INSAT 2010

Page 25: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 25/62

Exemple HelloWorld Pas à Pas

Page 26: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 26/62

Exemple: Hello World

26 Application Réparties INSAT 2010

Page 27: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 27/62

1- Définir les packages

2- Créer les interfaces

3- Coder les objets passés par valeur4- Coder les objets sur le serveur

5- Ecrire le main() sur le serveur

Les Etapes

6- Lancer rmiregistry et le serveur7- Coder et lancer le client

27 | A look Forward | January 2010

Page 28: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 28/62

Il est préférable mais pas obligatoire de :

Placer le code du client et du serveur dans des packages différents

Placer les interfaces distribuées dans un troisième package

Définir les packages

helloworld

28 | A look Forward | January 2010

helloworld.client helloworld.serverHelloworld.intfcimport import

Page 29: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 29/62

Interfaces et classes prédéfinies

29 Application Réparties INSAT 2010

Page 30: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 30/62

L ’interface HelloWorld

import java.rmi.*;

interface HelloWorld extends Remote

Interface = protocole d ’application

{

public String sayHello() throws RemoteException;

}

30 Application Réparties INSAT 2010

Page 31: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 31/62

Rôle de l’interface

HelloWorld

31 | A look Forward | January 2010

Page 32: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 32/62

L ’exception RemoteException doit être déclarée par toutes les méthodesdistantes

• Appels de méthodes distants moins fiables que les appels locaux

– Serveur ou connexion peut être indisponible– Panne de réseau

– ...

Exception

32 | A look Forward | January 2010

Page 33: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 33/62

HelloWorld hello = ...;

// Nous verrons par la suite comment obtenir

// une première référence sur un stub

String result = hello.sayHello();

System.out.println(result);

Du côté client

33 Application Réparties INSAT 2010

Page 34: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 34/62

Implémentation de la classe qui gère les méthodes de l ’interfaceHelloWorld

 // Classe d'implémentation du Serveur

public class HelloWorldImpl extends UnicastRemoteObject implements HelloWorld

{

public String sayHello() throws RemoteException

Du côté Serveur

String result = « hello world !!! »;System.out.println(« Méthode sayHello invoquée... » + result);

return result;

}

}

34 Application Réparties INSAT 2010

Page 35: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 35/62

Doit implémenter l’interface HelloWorld

Doit étendre la classe RemoteServer du paquetage java.rmi

RemoteServer est une classe abstraite

UnicastRemoteObject est une classe concrète qui gére la communication et lesstubs

Classe d’implémentation

35 Application Réparties INSAT 2010

Page 36: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 36/62

Classe d’implémentation

HelloWorld

36 Application Réparties INSAT 2010

HelloWorldImpl

Page 37: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 37/62

Outil livré avec le JDK permet de générer les stubs

> rmic HelloWorldImpl 

génère un fichier HelloWorldImpl_stub.class 

rmic doit être passé pour toutes les classes d'implémentation des Object

Distribués a in d'en énérer les stubs

L’outil RMIC

 

37 Application Réparties INSAT 2010

Page 38: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 38/62

L ’objet serveur HelloWorld (coté serveur bien entendu…)

On a créé l'objet serveur et on a une variable qui le référence

HelloWorld hello = new HelloWorldImpl();

On va enregistrer l'objet dans le RMIRegistry

Naming.rebind("HelloWorld",hello);

Enregistrement d ’une référence

L'objet est désormais accessible par les clients

38 Application Réparties INSAT 2010

Page 39: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 39/62

sur l'objet serveur HelloWorld

On déclare une variable de type HelloWorld et on effectue une recherche dansl'annuaire

HelloWorld hello =(HelloWorld)Naming.lookup("rmi://www.helloworldserver.com/HelloWorld");

On indique quelle est l'adresse de la machine sur laquelle s'exécute leRMIRegistry ainsi que la clé

 

Obtention d'une référence coté client

 

39 Application Réparties INSAT 2010

Page 40: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 40/62

Le Service de Nommage n'a pas pour fonction le référencement de tous lesobjets de serveur

• Il devient vite complexe de gérer l'unicité des clés

La règle de bonne utilisation du Naming est de lier des objets qui font office depoint d'entrée, et qui permettent de manipuler les autres objets serveurs

Remarque

40 Application Réparties INSAT 2010

Page 41: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 41/62

Rappel

• On veut invoquer la méthode sayHello() d'un objet de serveur distant de typeHelloWorld depuis un programme Java client

Nous allons devoir coder• L'objet distant

• Le serveur

 

Conception, implémentation et exécution de l'exemple

• Le client

• « Et définir les permissions de sécurité et autres emplacements de classes... »

41 Application Réparties INSAT 2010

Page 42: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 42/62

Une interface et une classe d'implémentation

stubs générés automatiquement par rmic

toutes les classes nécessaires à l’objet de client doivent être déployées sur lamachine cliente et accessibles au chargeur de classes (dans le CLASSPATH)

• L'interface HelloWorld (HelloWorld.class)

• Le stub HelloWorldImpl_stub généré par rmic pour cet objet

Hello World : L'objet distant

 

42 Application Réparties INSAT 2010

Page 43: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 43/62

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 arrêté

Hello World : Le serveur

43 Application Réparties INSAT 2010

Page 44: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 44/62

Hello World : Le serveur

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

public class HelloWorldServer

{public static void main(String[] args)

{try{

System.out.println("Création de l'objet serveur...");

 

44 Application Réparties INSAT 2010

e o or e o = new e o or mp ;

System.out.println("Référencement dans le RMIRegistry...");Naming.rebind("HelloWorld",hello);

System.out.println("Attente d'invocations - CTRL-C pour stopper");

}catch(Exception e)

{e.printStackTrace();

}}

}

Page 45: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 45/62

Apres avoir compilé le tout...

Pour démarrer le serveur, il faut tout d'abord lancer le RMIRegistry

Attention : La base de registres RMI doit connaître les interfaces et les stubs des objets

qu'elle enregistre (CLASSPATH) !!!

> rmiregistry &

et ensuite on lance le serveur

Serveur suite

 

> java HelloWorldServer création de l'objet serveur...

Référencement dans le RMIRegistry...

Attente d'invocations - CTRL-C pour stopper

45 Application Réparties INSAT 2010

Page 46: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 46/62

Obtenir une référence sur l'objet de serveur HelloWorld , invoquer la méthodesayHello(), puis afficher le résultat de l'invocation sur la sortie standard

Hello World : client

46 | A look Forward | January 2010

Page 47: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 47/62

Hello World : clientimport 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 méthode sayHello...");

47 Application Réparties INSAT 2010

String result = hello.sayHello();

System.out.println("Affichage du résultat :");

System.out.println(result);

System.exit(0);

}catch(Exception e)

{e.printStackTrace();

}}

}

Page 48: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 48/62

Il suffit ensuite de lancer le programme

> java HelloWorldClient

Recherche de l'objet serveur...

Invocation de la méthode sayHello...Affichage du résultat :

hello world !!!

Au niveau du serveur, le message...

Client suite

Méthode sayHello invoquée... hello world !!! ...s'affichera dans la console

48 Application Réparties INSAT 2010

Page 49: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 49/62

Lorsqu’un objet serveur est passé à un programme, soit comme paramètre soitcomme valeur de retour, ce programme doit être capable de travailler avec lestub associé

Le programme client doit connaître la classe du stub les classes des paramètres, des valeurs de retour et des exceptions doivent

aussi être connues...

Que doit connaître le client ?

• Une méthode distante est déclarée avec un type de valeur de retour...

• ...mais il se peut que l’objet réellement renvoyé soit une sous-classe du type déclaré

49 Application Réparties INSAT 2010

Page 50: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 50/62

Le client doit disposer des classes de stub, classes des objets retournés…

• Copier les classes sur le système de fichiers local du client (CLASSPATH)...

• ...cependant, si le serveur est mis à jour et que de nouvelles classes apparaissent, il

devient vite pénible de mettre à jour le client• C’est pourquoi les clients RMI peuvent charger automatiquement des classes de stub

depuis un autre emplacement

– Il s ’agit du même type de mécanisme pour les applets qui fonctionnent dans

Que doit connaître le client ?

un n v eur

50 Application Réparties INSAT 2010

Page 51: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 51/62

Problème de sécurité

• Le programme client télécharge du code sur le réseau

• Ce code pourrait contenir des virus ou effectuer des opérations non attendues !!!

• Utilisation d ’un gestionnaire de sécurité pour les applications de clients RMI• Possibilité de créer des gestionnaires de sécurité personnalisés pour des applications

spécifiques

 

Chargement dynamique des classes

 

51 Application Réparties INSAT 2010

Page 52: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 52/62

Pour ne plus déployer les classes du serveur chez le client

• Utilisation des chargeurs de classes qui téléchargent des classes depuis une URL

• Utilisation d’un serveur Web qui fournit les classes

Ce que ça change

• Bien entendu, les classes et interfaces de l’objet distant ne changent pas

• Le code du serveur ne change pas

Chargement dynamique

le client et la façon de le démarrer sont modifiés

Et lancer un serveur Web pour nos classes

52 Application Réparties INSAT 2010

ll ld h d i

Page 53: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 53/62

Séparation des classes

Serveur (fichiers nécessaires a l'exécution du serveur)

HelloWorldServer.class

HelloWorldImpl.class

HelloWorld.class

HelloWorldImpl_Stub.class

Hello World : chargement dynamique

Download (fichiers de classes à charger dans le programme client)

HelloWorldImpl_Stub.class

Client (fichiers nécessaires au démarrage du client)

HelloWorld.class

HelloWorldClient.class

53 Application Réparties INSAT 2010

H ll W ld Dé d W b

Page 54: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 54/62

Mettre les classes Download dans le répertoire des documents Web du serveurWeb, 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

Hello World : Démarrage du serveur Web

54 Application Réparties INSAT 2010

H ll W ld P liti d é ité

Page 55: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 55/62

Le programme Java client doit pouvoir se connecter aux ports de la base deregistres RMI et des implémentations des objets de serveur, ainsi qu'au port duserveur Web

Fichier client.policy 

grant

{

 

Hello World : Politiques de sécurité

perm ss on ava.net.Soc etPerm ss on : - , connect,reso ve ;

permission java.net.SocketPermission "*:80", "connect";

};

55 Application Réparties INSAT 2010

Hello World : gestionnaire de séc rité RMI

Page 56: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 56/62

Le client intègre un gestionnaire de sécurité RMI pour les stubs téléchargésdynamiquement

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

public class HelloWorldClient {

public static void main(String[] args) {

try {

 // Installe un gestionnaire de sécurité RMI

 

Hello World : gestionnaire de sécurité RMI

.

System.out.println("Recherche de l'objet serveur...");

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

System.out.println("Invocation de la méthode sayHello...");

String result = hello.sayHello();

System.out.println("Affichage du résultat :");

System.out.println(result);}

catch(Exception e) { e.printStackTrace(); }}

}

56 Application Réparties INSAT 2010

Hello World : Démarrage coté serveur

Page 57: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 57/62

1. Lancer la base de registres RMI (elle doit pouvoir accéder aux classesDownload - CLASSPATH)

> rmiregistry

2. Lancer le serveur Web servant les fichiers de classes Download3. Lancer le serveur (les classes Server doivent être accessibles)

> java HelloWorldServer

Hello World : Démarrage coté serveur

 

Création de l'objet serveur...

Référencement dans le RMIRegistry...

Attente d'invocations - CTRL-C pour stopper

57 Application Réparties INSAT 2010

Hello World : Démarrage coté client

Page 58: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 58/62

Le client doit pouvoir se connecter à des machines distantes pour la base deregistres RMI, les objets de serveur ainsi que le serveur Web

On doit lui fournir un fichier client.policy

Le client doit bien connaître l'emplacement des classes afin de pouvoir lestélécharger

On va le lui préciser lors du lancement

Hello World : Démarrage coté client

java -Djava.security.policy=client.policy

-D java.rmi.server.codebase=http://www.class-server.com:80/ HelloWorldClient

58 Application Réparties INSAT 2010

Erreurs classiques (1/2)

Page 59: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 59/62

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 à l’ordre d’appel : génération des stubs et appel du rmiregistry 

 

Erreurs classiques (1/2)

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 déjà lancé

 java.rmi.server.ExportException: Port already in use: 1099

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

59 Application Réparties INSAT 2010

Erreurs classiques (2/2)

Page 60: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 60/62

La classe d’implémentation n'hérite pas de UnicastRemoteObject

S'il n'hérite pas de UnicastRemoteObject, il n'est pas Remote donc on lui demanded'être Serializable ...Trouble:

 java.rmi.MarshalException: error marshalling arguments; nested exception

Is: java.io.NotSerializableException: CalculatorImpl

Erreurs classiques (2/2)

60 Application Réparties INSAT 2010

Une autre utilisation du rmiRegistry

Page 61: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 61/62

import java.rmi.registry.LocateRegistry;

import java.rmi.registry.Registry;

Client

Registry registry;

registry = LocateRegistry.getRegistry();

Une autre utilisation du rmiRegistry

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 Réparties INSAT 2010

Page 62: Cours JAVA RMI

5/14/2018 Cours JAVA RMI - slidepdf.com

http://slidepdf.com/reader/full/cours-java-rmi 62/62

www.alcatel-lucent.com  -

62 | A look Forward | January 2010