Cours JAVA RMI
-
Upload
laribi-chaker -
Category
Documents
-
view
442 -
download
1
Transcript of 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
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
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/
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
5/14/2018 Cours JAVA RMI - slidepdf.com
http://slidepdf.com/reader/full/cours-java-rmi 25/62
Exemple HelloWorld Pas à Pas
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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();
}}
}
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
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
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();
}}
}
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
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
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
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
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
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
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é
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
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
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
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)
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)
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
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
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