TP – RPC et RMI : Implémentation d’un Mini Middleware RMI
Objectif du TP : comprendre le principe des appels de méthodes distantes (RPC/RMI) en
implémentant une version simplifiée d’un système RMI en Java.
1. Rappels théoriques
Les RPC (Remote Procedure Call) permettent à un programme d’appeler une fonction située
sur une autre machine comme si elle était locale. RMI (Remote Method Invocation)
généralise ce principe aux objets.
2. Architecture du système
Le système comporte les composants suivants :
- Client : invoque une méthode distante
- Proxy (Stub) : transforme l’appel en requête réseau
- Serveur : exécute la méthode demandée
- Registry : associe un nom à un objet distant
3. Structure des messages
Les échanges entre client et serveur utilisent deux objets sérialisables :
Request :
- serviceName
- methodName
- paramTypes
- args
Response :
- ok
- result
- error
4. Partie 1 – Version simple : appel distant (8 pts)
Objectif : réaliser un appel distant simple avec une seule méthode.
Étape 1 : créer l’interface distante suivante :
public interface RemoteService {
String getMessage() throws Exception;
}
Étape 2 : implémenter la classe serveur RemoteServiceImpl qui retourne un message.
Étape 3 : implémenter un serveur TCP qui :
- attend une requête
- exécute la méthode demandée
- renvoie le résultat au client
Étape 4 : implémenter un proxy côté client permettant d’appeler la méthode distante.
5. Partie 2 – Invocation générique avec Reflection (8 pts)
Objectif : permettre l’appel de plusieurs méthodes distantes.
Nouvelle interface :
public interface RemoteService {
int add(int a, int b) throws Exception;
int multiply(int a, int b) throws Exception;
String getServerName() throws Exception;
}
Étapes :
1. Modifier Request pour transporter le nom de la méthode et les arguments.
2. Utiliser Java Reflection côté serveur pour invoquer dynamiquement la méthode.
3. Gérer les erreurs si la méthode n’existe pas.
6. Partie 3 – Implémentation d’un registre (4 pts)
Le registre permet d’associer un nom de service à un objet distant. Le client peut ensuite
retrouver ce service grâce à son nom.
Fonctions du registre :
- bind(String serviceName, String host, int port)
- lookup(String serviceName)
7. Programme de test
Le programme client doit :
1. rechercher le service dans le registre
2. appeler les méthodes distantes
3. afficher les résultats obtenus
Barème
Partie 1 : 8 points
Partie 2 : 8 points
Partie 3 : 4 points