Cette m´ethode est pratique en d´eveloppement1, mais ne doit pas ˆetre utilis´ee syst´ematiquement dans
le cadre d’un d´eveloppement final.
Le nom de l’objet dans la base de registre est un nom long, comme par exemple rmi://localhost/
objetDistant. On aurait tr`es bien pu l’appeler simplement objetDistant. On peut remarquer
qu’ici on a omis le num´ero de port, donc par d´efaut on consid`ere le port 1099. On peut ´egalement
d´efinir le num´ero de port du serveur en utilisant l’argument en ligne de commande de java.
L’interface d´evelopp´ee fait partie du paquetage fr.supaero.rmi.serveur. Les classes d´evelopp´ees
font partie du paquetage fr.supaero.rmi.serveur.base et les bytecodes correspondants sont sto-
ck´es dans un r´epertoire classesServeur.
4. du cˆot´e client, implanter une classe AppelDistant qui poss`ede une m´ethode main qui cherche une
r´ef´erence sur l’objet distant et appelle sa m´ethode afficher ;
Rien de particulier. Il ne fallait pas oublier de transtyper la r´ef´erence obtenue apr`es le lookup,
car on obtient une r´ef´erence de type java.rmi.Remote. De mˆeme, il faut poss´eder l’interface
InterfaceBonjour dans son classpath pour pouvoir compiler correctement le client.
La classe fait partie du paquetage fr.supaero.rmi.client.base et le bytecode correspondant est
stock´e dans le r´epertoire classesClient.
NB : vous remarquerez que j’ai d´etaill´e les exceptions qui peuvent ˆetre lanc´ees pour que vous voyez
bien quelles sont ces exceptions. On aurait bien sˆur pu rattraper toutes les exceptions avec un
catch (Exception e).
5. g´en´erer le stub de la classe BonjourDistant en utilisant l’option -v1.2 de rmic pour ne pas g´en´erer
de skeleton ;
6. lancer une base de registre grˆace `a rmiregistry et le serveur. On lancera le registre en prenant de
garde de bien positionner le classpath pour que le stub soit visible.
7. lancer le client. O`u s’ex´ecute la m´ethode de l’objet distant ?
Rien de bien particulier pour ces trois questions. Voici le d´etail des op´erations utilis´ees :
(a) lancement du registre. J’ai utilis´e la commande suivante :
CLASSPATH=/chemin_TP/classesRegistre/ rmiregistry
Je positionne le classpath pour que le registre puisse «voir »l’interface et le stub du serveur.
(b) «ex´ecution »de la classe fr.supaero.rmi.serveur.base.Enregistrement. Rien de bien
particulier, une erreur peut se produire si on n’a pas g´en´er´e le stub.
(c) «ex´ecution »de la classe fr.supaero.rmi.client.base.AppelDistant. Comme on n’utilise
pas de SecurityManager, on n’a pas acc`es au chargement dynamique des classes. Il faut donc
que le stub se trouve dans le classpath du client, sinon une exception est lev´ee (ce qui n’est pas
n´ecessaire si on peut le charger dynamiquement, cf. section 4).
On voit bien ici que la m´ethode afficher de l’objet distant s’ex´ecute du cˆot´e serveur.
A partir de la version 5.0 du JDK, lorsque l’on exporte un stub dans le registre, si le bytecode du
stub n’est pas disponible, on g´en´ere un objet de type java.lang.reflect.Proxy `a la place du
stub. Le client et le registre n’ont donc plus besoin d’avoir le bytecode du stub dans le classpath
(il faut bien sˆur que le client utilise du code et une JVM compatibles avec le JDK 5.0). J’ai
affich´e dans AppelDistant l’objet r´ecup´er´e par l’appel `a Naming.lookup. Si les stubs ont ´et´e
utilis´es par le serveur, le registre et le client, on obtiendra `a l’affichage :
Objet distant recupere : BonjourDistant_Stub[UnicastRef [liveRef:
1Elle est mˆeme n´ecessaire si on ne veut pas relancer le registre `a chaque fois.
2