Ecole Supérieur de Technologie de Khénifra
Département : Génie de l’informatique et mathématiques
Filière : Administrateur des Systèmes et Réseaux
Module : Systèmes et applications répartis
TP N°3 : Invocation des méthodes sur des objets distants avec java RMI
Objectifs du TP :
L'objectif de ce TP est de permettre à des applications clientes (s'exécutant localement)
d'invoquer des méthodes sur des objets distants, c'est-à-dire localisés dans une autre
application (dans une autre JVM de la même machine physique ou sur une autre machine
accessible via un réseau).
Principes généraux
Le but de RMI est de permettre l'appel, l'exécution et le renvoi du résultat d'une méthode
exécutée dans une machine virtuelle différente de celle de l'objet l'appelant. Cette machine
virtuelle peut être sur une machine différente pourvu qu'elle soit accessible par le réseau.
L'objet (le serveur) qui propose l'appel de ses méthodes par des objets distants doit offrir :
1. Une interface qui décrit l'ensemble des méthodes visibles à distance :
Cette interface doit hériter de [Link], ce qui rend les paramètres des
méthodes sérialisables.
Chaque méthode exportée d zz<<bbbb b b b b bb b bbbbbboit lever
l'exception, [Link].
2. /a classe qui implémente cette interface :
Elle doit hériter de [Link].
3. l'instanciation de cette classe et son enregistrement sous un nom auprès du service de
désignation de RMI (rmiregistry) :
appel à [Link].
L'appelant (le client) doit obtenir une référence sur l'objet distant :
1. Utilisation du [Link] pour trouver l'objet distant
2. Appel(s) de méthodes
Page 1/5
Exercice 1 :
Copier puis tester sur même machine et deux machines distantes le programme RMI vu en cours. Ce
programme est constitué des fichiers suivants :
[Link] : interface définissant les opérations appelables à distance
import [Link].*;
public interface HelloInterface extends Remote {
/* méthode qui imprime un message prédéfini dans l’objet
appelé */
public String sayHello() throws
[Link];
[Link] : classe implémentant les opérations appelables à distance
import [Link].*;
import [Link].*;
public class HelloImpl extends UnicastRemoteObject
implements HelloInterface {
private String message;
/* le constructeur */
public HelloImpl (String s) throws RemoteException {
super();
message = s ;
}
/* l’implémentation de la méthode */
public String sayHello () throws RemoteException {
return message ;
}
}
Page 2/5
[Link] : coté serveur, programme qui instancie un objet implétant les
opérations qui seront appelées à distance par les clients
import [Link].*;
import [Link];
public class HelloServer {
public static void main (String [ ] argv) {
try {
/*Lance un registry localement sur le port d'écoute passé
en paramètre : 1099*/
[Link](1099);
/* créer une instance de la classe Hello et l’enregistrer
dans le serveur de noms */
HelloImpl od=new HelloImpl ("Hello word !");
[Link] ("rmi//localhost:1099/HelloWord”, od) ;
[Link] ("Serveur prêt.") ;
} catch (Exception e) {
[Link] ("Erreur serveur : " + e) ; }
}
}
[Link] : coté client, programme qui appelle les opérations sur l'objet
distant
import [Link].*;
public class HelloClient {
public static void main (String [ ] argv) {
Coté serveur
try : {
/* trouver une référence vers l’objet distant */
HelloImpl hello = (HelloImpl)
[Link]("rmi//localhost:1099/HelloWord");
/* appel de méthode à distance */
[Link] ([Link]()) ;
} catch (Exception e) {
[Link] ("Erreur client : " + e) ; }
}
}
Page 3/5
Exercice 2 :
Développer une application client serveur RMI dans laquelle le serveur offre les services
distants suivant au client :
Fournir au client la date du serveur.
Convertir un montant exprimé en EURO vers un montant exprimé en DH
Calcule et renvoie le n-ième terme de la suite de Fibonacci
import [Link];
import [Link];
import [Link];
public interface InterfServiceDistant extends Remote {
public Date getServerDate()
throws RemoteException;
public double convertEuroToDH(double montant)
throws RemoteException;
Exercice 3 :
Un serveur gérera tous les comptes bancaires et permettra à des clients de se connecter et d’effectuer les
opérations suivantes :
Créer un compte en banque.
De verser un montant sur un compte
Retirer un montant d’un compte
Fixer un découvert.
Voici la déclaration des méthodes distantes :
float getSolde();
void verser(float mt);
void retirer(float mt);
float getDecouvert();
1. Ecrire une interface CompteInterface dérivant de Remote qui déclare les méthodes distantes.
2. Ecrire une classe CompteImpl qui implémente les méthodes de l’interface
CompteInterface.
3. Ecrire une classe ServeurBanque qui gère la partie serveur de notre application répartie.
4. Ecrire une classe ClientBanque qui gère la partie client de notre application répartie.
5. Lancer et tester l’application répartie.
Page 4/5
Exercice 4 :
On souhaite créer une application java qui permet de gérer un stock de produits.
La classe produit est défini par les attributs suivants :
Un numéro de type entier
La désignation du produit de type chaîne de caractères
Le prix du produit de type réel
La quantité en stock de type entier.
Travail demandé :
1) Créer les classes Produit.
2) Créer l’interface InterfStock déclarant les méthodes à implémenter. Les méthodes sont :
getProduits qui retourne les produits en stock
getProduit qui retourne un produit donné par son numéro
montantProduit qui retourne le montant d’un produit en stock (prix*quantité)
totalProduits qui retourne le montant total des produits en stock.
3) Créer une classe ImplStock qui implémente l’interface InterfStock contenant une liste
permettant de stocker les produits.
4) Générer le stub.
5) Créer une application Serveur.
6) Créer une application Client.
Déployer l’application.
Page 5/5