Remote).
Cette opération est réalisée en invoquant la
méthode statique lookup de la classe
Naming. Pour cela, il doit nommer
complètement l'objet concerné au travers d'une URL
de la forme générale suivante :
rmi://machine:port/nom
Dans une telle URL,
MonInterface talon;
try {
talon = (MonInterface)Naming.lookup(adresse_de_l'objet);
} catch (Exception e){-------- }
objet=talon.méthode(paramètres);
Les deux classes
CompteurClient
et
CompteurClient2
suivantes accèdent respectivement aux compteurs publiés
sous les noms cpt
et
cpt2
par le serveur lancé précédemment.
L'application correspondante doit être appelée
avec un prmier paramètre donnant le nom DNS du site hébergeant
l'objet et
getAccess
sur le compteur correspondant;
getValue
sur le compteur correspondant;
incr
sur le compteur correspondant.
|
La définition de la classe
CompteurClient2
diffère par l'argument utilisé lors de appel à
la méthode
lookup:
Compteur co = (Compteur) Naming.lookup("rmi://"+args[0]+"/cpt2");
Un exemple d'exécutions successives de clients est donné ci-après
(fluor
est le nom de la machine où le serveur est lancé):
|
Usine:
main de cette classe
a comme premier paramètre le nom
de l'objet et en second paramètre optionnel l'adresse de la machine
abritant le serveur (et l'objet) [la machine locale est considérée
si le second paramètre est omis];
Producteur et
Consommateur sont créées (ici 2 de chacune des
classes). Comme on le
verra, il s'agit de sous-classes de la classe
Thread: les différents processus
légers correspondants sont activés (méthode
start).
Producteur
run réalise une boucle infinie
dans laquelle un objet est déposé dans le buffer: il s'agit de la
chaine correspondant à la date courante. Entre chaque
dépôt la thread est endormie durant une période de durée
aléatoire.
Consommateur
run implante une boucle de lecture dans
le buffer.
Entre chaque lecture la thread est endormie durant une période de durée
aléatoire.