Programmation répartie avec RMI
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
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
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
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.
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.
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 ...
L’évaluation du travail réalisé comprendra une démonstration de l’application Forum dans les deux versions demandées.