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.

  1. Effectuer la compilation avec les commandes :
       javac *.java
       rmic MessageImpl
  2. Lancer le serveur de noms sur une machine (ici à l'écoute du port 2001) :
       rmiregistry 2001 & (Linux)
       start rmiregistry 2001 (Windows)
  3. Lancer 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 :



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.
  1. Lancer le serveur de noms sur votre propre machine :
       rmiregistry 2002 &
    puis lancer le serveur :
       java AnnuaireImpl 2002 &
  2. Lancer le client sur la même machine (votre machine) :    appletviewer AppletClient.html
    Remarquez les paramètres passés dans le fichier    AppletClient.html
  3. 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
  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. 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.

  1. Dans le répertoire MessageClone lancer la commande pkill rmir ; export CLASSPATH="."; rmiregistry &
  2. 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.
  3. 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.


   cd Sources
   javac *.java ; rmic AnnuaireImpl
   cd ..

   cd ServeurDeClasse
   javac *.java
   cd ..

   javac Lance.java


   cd ServeurDeClasse
   java -Djava.security.policy=java.policy ClassFileServer 2048 ../Sources &


  
   rmiregistry &
   java Lance machine1 AnnuaireImpl

  

   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]