TP3 : Java Remote Method Invocation (RMI)
Téléchargez cette archive contenant
des exemples à tester et à compléter.
Pour tous les exercices, pensez bien à tuer tous vos processus à
chaque fois que vous vous déloguez d'une machine Linux. En ce qui concerne
les processus java
ou rmiregistry
, vous pouvez
utiliser les commandes suivantes : pkill java ; pkill rmiregistry
Exercice 0
Vous trouverez votre premier code RMI dans le répertoire
MessageExercice
. Il s'agit d'un exemple simple d'appel
java RMI. Vous devez le compléter (en vous servant du cours
et du TD), puis le compiler et l'exécuter.
Dans un premier temps, lancez toutes les commandes sur votre propre
ordinateur. Dans un deuxième temps, placez le serveur et le client
sur deux machines différentes.
- Effectuer la compilation avec les commandes :
javac *.java
rmic MessageImpl
- Lancer le serveur de noms sur une machine (ici
à l'écoute du port 2001) :
rmiregistry 2001 &
(Linux)
start rmiregistry 2001
(Windows)
- Lancer le serveur sur la même machine :
java Serveur 2001 &
(Linux)
start java Serveur 2001
(Windows)
- Lancer un client :
java Client <machine serveur>:2001
Question subsidiaire : écrire le graphe de classes
pour cette application RMI en utilisant la commande
rmic -keep MessageImpl
au lieu de rmic
MessageImpl
. C'est à dire donner la liste des
dépendances de type "hérite" ou "implémente" ou
"utilise" entre toutes les classes de l'exercice.
Exemple :
-
java.rmi.server.RemoteObject
implémente Remote
,
Serializable
-
java.rmi.server.RemoteServer
hérite de java.rmi.server.RemoteObject
-
java.rmi.server.UnicastRemoteObject
hérite de
java.rmi.server.RemoteServer
Exercice 1
(facultatif)
Reprendre l'exercice avec la multiplication matricielle vu en TD,
l'implanter et le tester.
Exercice 2
Rendez-vous dans le répertoire TelephoneExercice
.
Voila un exemple simple d'appel java RMI depuis une applet.
Vous devez le compiler puis le faire fonctionner.
- Lancer le serveur de noms sur votre propre machine :
rmiregistry 2002 &
puis lancer le serveur :
java AnnuaireImpl 2002 &
- Lancer le client sur la même machine (votre machine) :
appletviewer AppletClient.html
Remarquez les paramètres passés dans le fichier
AppletClient.html
- Ajouter les fonctionnalités d'ajout et de suppression
d'une entrée dans l'annuaire téléphonique.
Vous concevrez ensuite deux petits clients distincts
qui ne seront pas des applets (ils ressembleront au
client de l'exercice 1)
Ils pourront être appeler de la maniere suivante :
java Ajoute <nom d'une personne> <No Telephone>
java Supprime <nom d'une personne>
Ils contacteront l'annuaire distant pour réaliser les opérations
d'ajout et de suppression demandées.
Remarque : voir la documentation Java, chercher la classe Hashtable
puis les méthodes put
et remove
- Ecrire un nouveau client
Lister
qui
affiche à l'écran la liste des entrées de
l'annuaire.
Remarque : vous pourrez utiliser dans la fonction que vous
écrirez dans AnnuaireImpl.java
, la ligne de code :
Iterator it = numeros.keySet().iterator();
. A l'aide de
cet itérateur, vous pourrez parcourir la liste et en afficher
chacun des elements.
- Lancer le serveur de noms et le serveur d'annuaire sur une autre
machine que la votre. Lancer l'applet depuis votre machine.
Cela ne doit pas marcher ! une exception du type "access denied"
est levée. Pour résoudre le problème de droit
que cela pose, vous pouvez utiliser la commande :
$ appletviewer
-J-Djava.security.policy=../TelephoneTelecharge/java.policy
AppletClient.html
Exercice 3
Rendez-vous dans le répertoire MessageClone
.
Regardez puis exécutez le script construit
.
- Dans le répertoire
MessageClone
lancer la commande pkill rmir ; export CLASSPATH=".";
rmiregistry &
- Taper
cd tServeur
puis exécutez le serveur.
Pourquoi cela ne fonctionne pas ? Répondez à cette question
et lancez le serveur avant de passer au point suivant.
- Sur une autre machine (qui va héberger le client),
se déplacez dans le répertoire
MessageClone/tClient
et exécuter le client. Vous constatez que le client n'a pas besoin
de la classe MessageImpl
correspondant à l'objet distant.
Exercice 4
Dans l'exercice 3, nous avons vu que le serveur demandait à
rmiregistry
de charger les classes dont il avait besoin.
Un autre moyen pour effectuer ce chargement à la demande est
de passer par un serveur web qui propose le téléchargement
des classes nécessaires.
Ce mécanisme (de chargement dynamique de classes) est
extrêmement puissant.
Dans cet exercice, vous allez faire fonctionner un mini-serveur web
(qui se trouve dans le répertoire ServeurDeClasse
).
Puis vous allez demander à un tout petit code java (Lance.java
)
de démarrer telle ou telle classe accessible sur ce mini-serveur
web.
Cela veut dire que sur un certain site où l'on souhaite exécuter,
soit le serveur, soit le client, on a pas besoin d'avoir le bytecode
(le fichier .class
) de leur classe ! On lance simplement
le programme Lance
en précisant sur quelle machine
aller chercher le bytecode du client ou du serveur.
Cette approche permet de faciliter grandement la maintenance d'une application.
Lorsque celle-ci évolue, les utilisateurs n'ont pas à
se soucier de télécharger une nouvelle version, la nouvelle
version est téléchargée automatiquement (certes il faut que le
coût de la transmission ne soit pas exagerée).
Pour cet exercice, placez vous dans le répertoire TelephoneTelecharge
.
Vous aurez besoin de trois "fenêtres" (shell) et vous
exécuterez une application dans chacune.
- Compilation (sur n'importe quelle machine !) :
cd Sources
javac *.java ; rmic AnnuaireImpl
cd ..
cd ServeurDeClasse
javac *.java
cd ..
javac Lance.java
- Serveur de classes sur machine1 (création du mini serveur
web) (par précaution, tuer au préalable tous les
programmes
java
et rmiregistry
qui tournent) :
cd ServeurDeClasse
java -Djava.security.policy=java.policy ClassFileServer 2048
../Sources &
- Serveur sur machine2 (chargement de la
classe
AnnuaireImpl
depuis le mini serveur web et
démarrage du serveur d'annuaire) :
rmiregistry &
java Lance machine1 AnnuaireImpl
- Client sur une machine3 (lancement
du client avec téléchargement des classes
nécessaires) :
java Lance machine1 Client machine2
Récrire l'une des applications
vues dans les exercices précédents en utilisant le
mécanisme de téléchargement automatique.
[Page réalisée à à l'aide
d'un document de Guillaume
Latu]