University of Batna 2 Computer Science Department M1:ISIDS
2023/2024 Course:SID
TD 2: Java Remote Method Invocation (RMI)
L’architecture RMI est basée sur un principe important :
◼ La définition du comportement et l’exécution de ce comportement sont des concepts
séparés.
Rappel sur les interfaces :
- Classe abstraite : classe non instanciable, c'est à dire qu'elle n'admet pas d'instances
directes. c.a.d Impossible de faire new ClasseAbstraite (…).
- Méthode abstrait : opération n'admettant pas d'implémentation au niveau de la classe
dans laquelle elle est déclarée, on ne peut pas dire comment la réaliser.
- Une classe pour laquelle au moins une opération abstraite est déclarée est une classe
abstraite (l'inverse n'est pas vrai).
- Une interface est une classe abstraite qui ne contient que des méthodes abstraites.
- Une classe peut hériter d’une seule classe et peut implémenter plusieurs interfaces.
- Implémenter une interface signifie qu’il faut redéfinir toutes les méthodes déclarées
dans l’interface.
- Une interface est destinée à être “réalisée” (implémentée) par d’autres classes (celles-
ci en héritent toutes les descriptions et concrétisent les opérations abstraites)
1
University of Batna 2 Computer Science Department M1:ISIDS
2023/2024 Course:SID
Démarche RMI :
Exemple :
Supposant qu’on veut créer un serveur RMI qui crée un objet qui offre les services distants
suivant à un client RMI :
Service : réaliser la somme de deux entiers !
Fig : schéma RMI
1. Interface "Calculatrice" (Calculatrice.java) :
Cette partie du code définit une interface Java appelée "Calculatrice".
L'interface étend l'interface Remote de RMI, ce qui la rend compatible avec les appels
de méthodes distantes.
L'interface déclare une méthode addition qui prend deux entiers en argument et
renvoie un entier. La méthode doit déclarer qu'elle peut générer une exception
RemoteException.
Interface Calculatrice : Code Java :
package RMI;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Calculatrice extends Remote {
int addition(int a, int b) throws RemoteException;
}
2
University of Batna 2 Computer Science Department M1:ISIDS
2023/2024 Course:SID
2. Implémentation côté serveur (CalculatriceImpl.java) :
Cette partie du code crée une classe Java appelée "CalculatriceImpl" qui implémente
l'interface "Calculatrice".
La classe étend UnicastRemoteObject, ce qui la rend capable d'être utilisée comme
objet distant. La classe contient un constructeur qui appelle le constructeur de la
superclasse.
La méthode addition est implémentée pour effectuer une addition simple entre deux
entiers et renvoyer le résultat. Cette méthode doit également déclarer qu'elle peut
générer une exception RemoteException.
Classe Calculatrice Impl : Code Java :
package RMI;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class CalculatriceImpl extends UnicastRemoteObject implements Calculatrice
{
/**
*
*/
public CalculatriceImpl() throws RemoteException {
super();
}
@Override
public int addition(int a, int b) throws RemoteException {
return a + b;
}
}
3. Serveur RMI (ServeurRMI.java) :
Cette partie du code crée une classe Java appelée "ServeurRMI" qui représente le
serveur RMI.
Dans la méthode main, un objet "Calculatrice" est instancié avec l'implémentation
"CalculatriceImpl" que nous avons créée précédemment.
Ensuite, un registre RMI est créé à l'aide de
LocateRegistry.createRegistry(1099). Le registre RMI agit comme un annuaire
permettant aux clients de rechercher des objets distants.
L'objet "Calculatrice" est ensuite lié au registre RMI sous le nom "Calculatrice" à
l'aide de registry.rebind("Calculatrice", calculatrice).
3
University of Batna 2 Computer Science Department M1:ISIDS
2023/2024 Course:SID
Classe ServeurRMI : Code Java :
package RMI;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class ServeurRMI {
public static void main(String[] args) {
try {
// Créez un registre RMI sur le port 1099 (port par défaut)
Registry registry = LocateRegistry.createRegistry(1099);
Calculatrice calculatrice = new CalculatriceImpl();
// Liez l'objet calculatrice au registre
registry.rebind("Calculatrice", calculatrice);
System.out.println("Serveur RMI en cours d'exécution...");
} catch (Exception e) {
System.err.println("Erreur du serveur RMI : " + e.toString());
e.printStackTrace();
}
}
}
4. Client RMI (ClientRMI.java) :
Cette partie du code crée une classe Java appelée "ClientRMI" qui représente le client
RMI.
Dans la méthode main, le client commence par obtenir une référence au registre RMI
situé sur "localhost" (l'adresse du serveur RMI).
Ensuite, le client recherche l'objet distant "Calculatrice" dans le registre RMI à l'aide
de registry.lookup("Calculatrice").
Enfin, le client invoque la méthode distante addition(5, 3) sur l'objet "Calculatrice"
récupéré depuis le registre RMI et affiche le résultat.
4
University of Batna 2 Computer Science Department M1:ISIDS
2023/2024 Course:SID
Classe ClientRMI : Code Java :
package RMI;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class ClientRMI {
public static void main(String[] args) {
try {
Registry registry = LocateRegistry.getRegistry("localhost");
Calculatrice calculatrice = (Calculatrice) Naming.lookup("Calculatrice");
int resultat = calculatrice.addition(5, 3);
System.out.println("Résultat de l'addition : " + resultat);
} catch (Exception e) {
System.err.println("Erreur du client RMI : " + e.toString());
e.printStackTrace();
}
}
}
5. Déploiement et exécution :
1. Compilation : Compilez les fichiers Java en utilisant la commande javac pour créer
les fichiers de classe correspondants. Vous devez compiler les fichiers suivants :
Calculatrice.java, CalculatriceImpl.java, ServeurRMI.java, et
ClientRMI.java.
2. Démarrage du Registre RMI : Démarrez le registre RMI en utilisant la commande
rmiregistry. Le registre RMI agit comme un annuaire pour enregistrer et rechercher
des objets distants.(dans cet exemple le registre RMI démarre automatiquement avec
le Serveur , résultat de l’éxecution de la ligne
« LocateRegistry.createRegistry(1099) »
3. Démarrage du Serveur RMI : Exécutez le serveur RMI en utilisant la commande
java ServeurRMI. Le serveur expose l'objet distant "Calculatrice" pour que les clients
puissent l'utiliser.
4. Démarrage du Client RMI : Exécutez le client RMI en utilisant la commande java
ClientRMI. Le client contacte le serveur RMI, effectue une addition à distance en
utilisant l'objet "Calculatrice" et affiche le résultat.