| |
Exemples de programmes Java RMI
Les fichiers suivants contiennent plusieurs exemples de programmes Java RMI.
L'objectif est de mesurer dans différentes situation le coût d'un appel entre
un client et un serveur.
Le Client et le Serveur sont dans 2 JVM distinctes sur la même machine
simplement pour des facilité de mise en oeuvre.
Scénario 1 : le client effectue des appels vides
Scénario 2 : le client passe en paramètre un objet local qu'il a
créé. Le serveur demande à l'objet reçu d'afficher son état.
Remarque : comme il s'agit d'un objet local, celui doit être
sérialisable et une copie de cet objet est transmis au serveur. Pour que
cette copie puisse s'effectuer, le client et le serveur doivent connaître la
classe implémentant l'objet local (ObjetLocal). Le serveur demande
l'affichage de l'état de l'objet reçu en paramètre et la fenêtre dans laquelle
l'affichage s'effectue atteste de la JVM qui contient l'objet.
Scénario 3 : le client passe en paramètre un objet distant qu'il a
créé. Le serveur demande à l'objet reçu d' afficher son état.
Remarque : comme il s'agit d'un objet distant, celui n'a pas à être
sérialisable mais il doit étendre UnicastRemoteObject. Le client et le
serveur partagent cet objet. Seul le client connaît la classe qui implémente
l'objet distant (ObjetDistant) puisque c'est lui qui cré cet objet. Cet objet
distant n'est pas enregistré dans le service de nom, sa référence est
transmise en paramètre par le client au le serveur. Le
serveur ne connaît et manipule que l'interface du service (ObjetDistant_itf).
Le serveur demande l'affichage de l'état de l'objet reçu en paramètre et la fenêtre dans laquelle
l'affichage s'effectue atteste de la JVM qui contient l'objet.
Scénario 4 : le client passe en paramètre un objet distant
précédement créé qui existe dans une troisième JVM. Le serveur demande à
l'objet reçu d' afficher son état.
Remarque : comme il s'agit d'un objet distant, celui n'a pas à être
sérialisable mais il doit étendre UnicastRemoteObject. Le client et le
serveur partagent cet objet. Le client et le serveur ne connaissent et
manipulent que l'interface du service (ObjetDistant_itf). LLe serveur demande
l'affichage de l'état de l'objet reçu en paramètre et la fenêtre dans laquelle
l'affichage s'effectue atteste de la JVM qui contient l'objet. Pour ce troisième objet le stub n'est
pas sur le site du client, ni sur celui du serveur, ils vont le chercher sur
le serveur web de l'ESSI dans lequel le stub a été
précédemment déposé.
Voici les différentes classes
et un fichier de propriété
Ces classes seront réparties dans les trois répertoires suivant :
- serveur : Serveur.java,
Serveur_itf.java, ObjetLocal.java,
ObjetDistant_itf.java, ObjetStubInconnu_itf.java
- client : Client.java, Serveur_itf.java,
ObjetLocal.java, ObjetDistant.java,
ObjetDistant_itf.java, ObjetStubInconnu_itf.java
- osi : ObjetStubInconnu.java,
ObjetStubInconnu_itf.java
Pour installer l'ensemble
Pour compiler l'ensemble
- compilation du client :
javac Client.java
Compile ce qui est nécessaire au client : Client.java, Serveur_itf.java,
ObjetLocal.Java, ObjetDistant.Java, ObjetDistant_itf.java et
ObjetStubInconnu_itf.java
- compilation du serveur :
javac Serveur.java
Compile ce qui est nécessaire au serveur : Serveur.java, Serveur_itf.java,
ObjetLocal.Java, ObjetDistant_itf.java et ObjetStubInconnu_itf.java
rmic Serveur
Génère les stub/skeleton du Serveur
- génération des stub/skeleton de l'objet distant :
rmic ObjetDistant
Génère les stub/skeleton de l'ObjetDistant
- compilation de l'objet Distant présent dans la troisième JVM :
javac ObjetStubInconnu
Compile ce qui est nécessaire à l'ObjetStubInconnu :
ObjetStubInconnu.Java et ObjetStubInconnu_itf.java
rmic ObjetStubInconnu
Génère les stub/skeleton de l'ObjetDistant
Pour exécuter l'ensemble
- ajouter un fichier policy.all dans les
répertoires client, serveur et osi
grant {
// permettre les connexions socket sur les ports 2000 à 2100 utilisés
permission java.net.SocketPermission "*:2000-2100", "accept, connect";
// permettre les connexions socket sur le port 80 utilisé par http
permission java.net.SocketPermission "*:80", "connect";
// permettre tous les appels de méthodes
permission java.security.AllPermission "", "";
};
- ATTENTION :
Quelques mouvements de code sont nécessaires :
- déplacer Serveur_stub.class du répertoire du
serveur vers celui du client
- déplacer ObjetDistant_stub.class du répertoire du
client vers celui du serveur
- ces déplacements sont pris en charge par les
scripts d'installation
- depuis repertoire serveur :
java
-Djava.security.policy=policy.all Serveur
crée le service de désignation, crée l'objet serveur et l'enregistre
dans le service de désignation
- depuis le répertoire osi :
java
-Djava.security.policy=policy.all -Djava.rmi.server.codebase=http://www.essi.fr/~riveill/myclasses/
ObjetStubInconnu
crée l'objet distant dont les stub seront chargés par http
Vous pouvez changer l'adresse si vous voulez charger
vos propres stub.
- depuis le répertoire client :
java -Djava.security.policy=policy.all Client
crée l'objet client, joue les scénarios 1, 2, 3 et 4.
- ATTENTION :
L'ensemble du code a été écrit pour s'exécuter sur
la même machine qui s'appelle 'localhost'. Pour utiliser les mêmes
programmes sur différentes machines vous pouvez soit mettre le numéro IP,
soit mettre le nom de la machine.
Remarque : depuis la version 1.2, les skeleton ne sont plus nécessaires
(utilisation du package java.reflect). On peut activer rmic avec une option
permettant de ne pas générer les fichiers skeleton.A faire :
travailler le pb lié au passage du stub entre client et serveur dans le cadre de
l'objet distant afin d'éviter la recopie (actuellement copie du fichier),
permettre l'activation
|