Université Louis Pasteur
LICENCE 3ème année
Vendredi 9 mars 2007
Travaux
Pratiques
de
Programmation Distribuée
(sujet
n°3)
Remote
Method Invocation (RMI)
Télécharger ces
exemples.
La documentation Java est disponible à cette
adresse.
Pour tous les exercices
: pensez bien à tuer tous vos processus à chaque fois que
vous vous délogez d'une machine Linux. En ce qui concerne les
processus java
ou rmiregistry
, vous pouvez
utiliser les commandes suivantes : pkill java ; pkill rmiregistry
Exercice 1
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 !), puis le compiler et
l'exécuter. Dans un premier temps lancez toutes les commandes
sur votre propre ordinateur. Dans un second temps, (si vous disposez de
plusieurs machines) placez le serveur et le client sur deux machines
différentes.
1. Effectuez la compilation avec les commandes :
javac *.java
rmic MessageImpl
2. Lancez le serveur de noms sur une machine (ici
à l'écoute du port 2001) :
rmiregistry 2001 &
(Linux)
start rmiregistry 2001
(Windows)
3. Lancez le serveur sur la même machine
java Serveur 2001 &
(Linux)
start java Serveur 2001
(Windows)
4. 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 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.
1. Lancez le serveur de noms sur votre propre machine
rmiregistry 2002 &
(ou sous
windows : start rmiregistry 2002
)
puis lancez le serveur
java AnnuaireImpl 2002 &
(ou
sous windows : start java AnnuaireImpl 2002
)
2. Lancez le
client sur la même machine (votre machine). Remarquez les
paramètres passés dans le fichier AppletClient.html
.
appletviewer AppletClient.html
3. Ajoutez les
fonctionnalités d'ajout et d'effacement 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
.
4. 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.
5. Lancez 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 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
.
1. Dans le répertoire MessageClone
lancer la commande pkill rmir ; export CLASSPATH=".";
rmiregistry &
.
2. Tapez cd
tServeur
puis exécutez le serveur. Cela ne fonctionne pas
... Pourquoi ? Répondez à cette question et lancez le
serveur avant de passer au point suivant.
3. Sur une autre
machine (qui va héberger le client), se déplacez dans le
répertoire MessageClone/tClient
et exécutez
le client. Vous constatez que le client n'a pas besoin de la classe MessageImpl
correspondant à l'objet distant.
Exercice 4
On désire
implanter un serveur de calcul sur des matrices n
x
n
à coefficients réels qui offre comme
service : - la multiplication de deux matrices. Vous utiliserez pour ce
service distant l'interface fournie dans le fichier OpMatrice.java
Remarque : la formule à utiliser pour C = A.B
est :
pour tout i
,j
,
on a c[i][j] =
(Somme sur k de) a[i][k]*b[k][j];
Mettre en place un
tel serveur. Il devra pouvoir être appelé par un client
depuis une autre machine. Vous appellerez à distance une
méthode qui effectuera la multiplication des matrices
(envoyées par le client) :
int[][] a = { {1, 0, 0}, {0, 2,
0}, {0, 0, 3} };
int[][] b = { {1, 2, 3}, {1, 2, 3}, {1, 2, 3} };
Vous afficherez le résultat (pour cela
vous
écrirez une méthode qui se chargera de l'affichage).
Exercice 5
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
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 à partir d'un document de Guillaume
Latu]