Exercices TP Communication par Middleware RMI -Développement d'applications réparties

Ce document est destiné aux étudiants de l'Université Constantine 2 –Abdelhamid Mehri, Faculté des NTIC, Département de IFA, Master 1 / RSD, pour le cours de DARE 2021-2022.

Il couvre les notions suivantes:

  • Généralités sur RMI (Remote Method Invocation)
  • Principe de base de la création et de l'appel d'un objet distant avec RMI
  • Étude de cas simplifiée de communication à travers RMI

Exercices TP Communication par Middleware RMI -Développement d'applications réparties

Télécharger PDF

1. Généralités

RMI (Remote Method Invocation) est une technologie développée et fournie par Sun à partir du JDK 1.1 pour permettre la mise en œuvre facile des objets distribués. 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, pourvu qu'elle soit accessible par le réseau.

La machine sur laquelle s'exécute la méthode distante est appelée serveur.

L'appel coté client d'une telle méthode est un peu plus compliqué que l'appel d'une méthode d'un objet local mais il reste simple. Il consiste à obtenir une référence sur l'objet distant puis à simplement appeler la méthode à partir de cette référence.

La technologie RMI se charge de rendre transparente la localisation de l'objet distant, son appel et le renvoi du résultat.

Elle utilise deux classes particulières, le stub et le skeleton, qui sont générées avec l'outil rmic fourni avec le JDK.

Le stub est une classe qui se situe côté client et le skeleton est son homologue coté serveur. Ces deux classes se chargent d'assurer tous les mécanismes d'appel, de communication, d'exécution, de renvoi et de réception du résultat.

2. Principe de base

Les différentes étapes pour créer un objet distant et l'appeler avec RMI sont:

1. Le développement coté serveur se compose de:

  • La définition d'une interface qui contient les méthodes qui peuvent être appelées à distance.
  • L'écriture d'une classe qui implémente cette interface.
  • L'écriture d'une classe qui instancie l'objet et l'enregistre en lui affectant un nom dans le registre de noms RMI (RMI Registry).

2. Le développement côté client se compose de :

  • L'obtention d'une référence sur l'objet distant à partir de son nom.
  • L'appel à la méthode à partir de cette référence.

3. Etude de cas

L’objectif de cette étude de cas simplifiée est de montrer la communication à travers RMI. Nous disposons d’un service qui offre une opération (méthode) qui affiche « Bonjour Master RSD ».

A. Développement coté serveur

1. Création de l’interface

On souhaite rendre cette méthode accessible à distance de manière à ce qu’elle définisse l’interface entre le client et le serveur. L'interface à définir doit hériter de l'interface java.rmi.Remote.

import java.rmi.*;

public interface Information extends Remote {
 public String getInformation() throws RemoteException;}

2. Implémentation de la méthode de l’interface

La classe qui implémente l’interface correspondant à l'objet distant doit obligatoirement hériter de la classe UnicastRemoteObject, qui contient les différents traitements élémentaires pour un objet distant.

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class InformationImpl extends UnicastRemoteObject implements Information {
 private static final long serialVersionUID = 2674880711467464646L
 protected InformationImpl() throws RemoteException {
 super(); }

 public String getInformation() throws RemoteException {
 System.out.println("Invocation de la méthode getInformation()");
 return "bonjour Promotion RSD 21-22"; }}

3. L'instanciation d'un objet de la classe distante

Cette opération est très simple puisqu'elle consiste simplement en la création d'un objet de la classe de l'objet distant.

InformationImpl informationImpl1 = new InformationImpl();

4. L'enregistrement dans le registre de noms RMI

La dernière opération, coté serveur, consiste à enregistrer l'objet créé dans le registre de noms en lui affectant un nom. Ce nom est fourni au registre sous forme d'une URL constituée du préfix rmi://, du nom du serveur (hostname) et du nom associé à l'objet précédé d'un slash. Le nom du serveur peut être fourni « en dur » sous forme d'une constante chaîne de caractères ou peut être dynamiquement obtenu en utilisant la classe InetAddress pour une utilisation en locale. C'est ce nom qui sera utilisé dans une URL par le client pour obtenir une référence sur l'objet distant. L'enregistrement se fait en utilisant la méthode rebind de la classe Naming. Elle attend en paramètre l'URL du nom de l'objet et l'objet lui-même.

try {
InformationImpl informationImpl1 = new InformationImpl();
String url = "rmi://" + InetAddress.getLocalHost().getHostAddress() + ":" + 1099+ "/TestRMI";
System.out.println("Enregistrement de l'objet avec l'url : " + url);
Naming.rebind(url, informationImpl1);

5. Le lancement dynamique du registre de noms RMI

Sur le serveur, le registre de noms RMI doit s'exécuter avant de pouvoir enregistrer un objet ou obtenir une référence. Ce registre peut être lancé en tant qu'application fournie dans le JDK (rmiregistry) ou être lancé dynamiquement dans la classe qui enregistre l'objet. Ce lancement ne doit avoir lieu qu'une seule et unique fois. Il peut être intéressant d'utiliser le code ci-dessous si l'on crée une classe dédiée à l'enregistrement des objets distants.

Le code pour exécuter le registre est la méthode createRegistry() de la classe java.rmi.registry.LocateRegistry. Cette méthode attend en paramètre un numéro de port.

try {LocateRegistry.createRegistry(1099); }
catch (RemoteException e) {
 e.printStackTrace();}

Ce registre permet de faire correspondre un objet à un nom et inversement. C'est lui qui est sollicité lors d'un appel aux méthodes Naming.bind() et Naming.lookup().

B. Développement coté client

L'appel d'une méthode distante peut se faire dans une application ou dans une applet.

1. L'obtention d'une référence sur l'objet distant à partir de son nom

Pour obtenir une référence sur l'objet distant à partir de son nom, il faut utiliser la méthode statique lookup() de la classe Naming. Cette méthode attend en paramètre une URL indiquant le nom qui référence l'objet distant. Cette URL est composée de plusieurs éléments : le préfix rmi://, le nom du serveur (hostname) et le nom de l'objet tel qu'il a été enregistré dans le registre précédé d'un slash.

La méthode lookup() va rechercher l'objet dans le registre du serveur et retourner un objet stub. L'objet retourné est un objet de la classe Remote (la classe mère de tous les objets distants –c’est le stub). Si le nom fourni dans l'URL n'est pas référencé dans le registre, la méthode lève l'exception NotBoundException.

try { Remote r = Naming.lookup("rmi://"
+InetAddress.getLocalHost().getHostAddress() + ":" + 1099 + "/TestRMI");
System.out.println(r);

2. L’appel de la méthode distante

if (r instanceof Information) {
String s = ((Information) r).getInformation();
System.out.println("chaine renvoyée = " + s);
}}
catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace(); }
System.out.println("Fin du client");

FAQ

1. Qu'est-ce que RMI ?

RMI (Remote Method Invocation) est une technologie développée par Sun pour permettre l'appel de méthodes sur des objets distants via le réseau.

2. Comment fonctionne RMI ?

RMI utilise des stubs et skeletons pour gérer les appels de méthodes distantes. Le stub se trouve côté client et le skeleton côté serveur.

3. Quelles sont les étapes pour créer un objet distant avec RMI ?

Les étapes incluent la définition d'une interface, l'implémentation de cette interface, l'instanciation de l'objet et son enregistrement dans le registre RMI.



Partagez vos remarques, questions , propositions d'amélioration ou d'autres cours à ajouter dans notre site

Enregistrer un commentaire (0)
Plus récente Plus ancienne