Programmation répartie avec RMI

 

Rappels

o      Compiler un fichier <X.java

java -classpath ... :$CLASSPATH <X.java

o      Exécuter le programme

java -classpath ... :$CLASSPATH X

o      Produire la documentation dans le directory Docs

javadoc -d Docs *.java

o      Produire le fichier jar

jar cvf X.jar <files.class

  1. Objectif


L'objectif de ce TP est l'initiation à la programmation répartie. Il consiste à programmer une application typique comportant de la répartition à l'aide du mécanisme RMI de Java. Vous devez programmer les parties "client" et "serveur" de cette application et la faire exécuter dans un environnement fait de plusieurs machines virtuelles. Ces machines pouvant être sur une seule machine physique ou dispersées sur plusieurs. Vous pouvez utiliser hoff et les Pcs comme machines physiques de support.


Schéma 1 : Schéma de principe

  1. Spécification


L'objectif est la gestion d'un forum de discussion pouvant faire intervenir un nombre quelconques d'intervenants. Chaque intervenant peut émettre des messages qui sont diffusés à l'ensemble des intervenants. Les messages ne sont pas mémorisés par le forum. Seuls les intervenants présents sur le forum reçoivent les messages émis. Pour émettre un intervenant doit être connecté au forum. Le protocole d'un forum est très simple et se résume par la spécification des opérations autorisées

Enter : permet à un intervenant de se connecter au forum

Leave : permet à un intervenant de se déconnecter d'un forum

Say : permet à un intervenant d'émettre un message

Who : permet à un intervenant de connaître l'ensemble des intervenants connectés au forum

Un intervenant ne peut être connecté qu'à un seul forum simultanément.

Pour lancer une exécution avec le serveur RMI attaché au port <Port>,

coté serveur, c'est la même chose qu'avant :

rmiregistry <Port> &

java -Djava.rmi.server.codebase= http://<X>/<ForumServer>/ -Djava.security.policy=policy Forum //<X>:<Port>/toto

coté client, on lance avec :

java -Djava.security.policy=policy Intervenant Claudius Chiffon

 

  1. Informations disponibles
     Vous devez télécharger la version 1 de démonstration.

 

  1. Structure générale de l’application

Le schéma décrit la partie interface utilisateur (GUI) de l'application. Vous n'êtes concerné que par les partie non grisées qui correspondent aux interfaces fournies et à fournir. L'interface _TalkEventIntervenantAdaptator décrit les fonctionnalités pouvant être utilisées par la classe Intervenant, l'interface _IntervenantComposant décrit les fonctionnalités devant être fournies par la classe Intervenant.

Vous trouverez dans la version 1, le code d'initialisation de la partie GUI.

  1.  Travail à réaliser

 

    1. Forum réparti

Il s’agit de transformer l’application Forum pour la rendre distribuée. Les intervenants et le Forum sont maintenant des entités distantes, qui s’exécutent dans des machines virtuelles distinctes. Le protocole utilisé pour les communications entre les entités distantes est RMI.

    1. Téléchargement des classes

Afin de rendre plus souple l'utilisation de l'application, on décide de la rendre exécutable depuis un serveur qui fournit l'ensemble des classes nécessaires regroupées dans un répertoire que l'on nomme <ForumServer> sur une machine <X>. Sur une autre machine <Y>, il y a la partie cliente qui ne contient que la classe Chargeur. Il faut que l'interface Executable.java qui abstrait les classes chargeables par le chargeur soit à la fois coté client et coté serveur. Elle y est indispensable, ne serait-ce que pour compiler les autres classes. Nous souhaitons ici pouvoir exécuter des applications "Intervenant" sans disposer localement du code de cette application. Pour cela cette classe Intervenant doit implanter l'interface Chargeable. Pour des raisons de simplification de la classe ProgramLoader.java, toutes les classes doivent être directement accessibles, il vous faudra donc les extraire des fichiers .jar.

Comme vous pouvez le constater en lisant le code de Chargeur.java, le chargeur crée une instance de la première classe qu'il charge (en l'occurrence Intervenant), puis appelle la méthode main(String[]) spécifiée dans l'interface Chargeable et que la classe chargée doit implantée.

Pour lancer une exécution avec le serveur RMI attaché au port <Port>,

coté serveur, c'est la même chose qu'avant :

rmiregistry <Port> &

java -Djava.rmi.server.codebase= http://<X>/<ForumServer>/ -Djava.security.policy=policy Forum //<X>:<Port>/toto

coté client, on lance avec :

java -Djava.security.policy=policy Chargeur http://<X>/<ForumServer>/Intervenant Claudius Chiffon

On va chercher les classes au travers du réseau. Observez les traces au passage ...

 

    1. Evaluation

L’évaluation du travail réalisé comprendra une démonstration de l’application Forum dans les deux versions demandées.