Vous êtes sur la page 1sur 17

Remote Method Invocation

RMI

20/12/2019 1
RMI

La technologie RMI est une solution proposée par SUN (Oracle) pour permettre à des objets Java
d’invoquer des méthodes sur des objets localisés dans des JVM différentes, et même distantes sur le
réseau:
 Core API (intégré au JDK 1.1)
 Développé par JavaSoft
 Réservé aux objets Java
 Utilise les sockets et le protocole IIOP/JRMP

20/12/2019 2
RMI

20/12/2019 3
RMI
Principe Général

Séparation entre la définition d'un service et son implémentation


 Interface du service
 Implémentation du service
 Proxy vers le service
L'objet distant possède un représentant (proxy) sur la machine
locale; ceci permet d'invoquer une méthode de l'objet B comme si
celui-ci était local

20/12/2019 4
RMI
Architecture de l'invocation de méthodes

Client Server

1 6
3 4

Souche
stub Squelette
skeleton
2
JVM JVM
5

20/12/2019 5
RMI
Couche Application

du côté serveur et client : l'interface MyServer.class


 hérite de la classe java.rmi.Remote
 décrit les méthodes invocables à distance
 chacune de ces méthodes peut lever une exception java.rmi.RemoteException
du côté serveur : la classe MyServerImpl.class
 hérite de la classe java.rmi.UnicastRemoteObject
 implémente l'interface MyServer.class
 doit s'enregistrer au près d 'un serveur de références (couche référence distante)

20/12/2019 6
RMI
Couche Souche et Squelette

 Le client ne peut pas invoquer directement une méthode de l’implémentation par le réseau
 Une souche et un squelette capables de communiquer par le réseau sont automatiquement générés
 La souche est déployée chez le client et le squelette chez le serveur

20/12/2019 7
RMI
Souche ou Stub (sur le client)
- emballage des arguments
Objet Invocation d’une méthode - transfert de l’invocation
squelette
Client Retour de la méthode - Réception de la réponse
- déballage du retour

C’est la procédure d’interface du site client:


 qui reçoit l’appel en mode local
 le transforme en appel distant en envoyant un message.
 Convertit les arguments en un format transmissible via le réseau
 reçoit les résultats après l'exécution
 Reconstruit les valeurs de retour à partir de données reçues par le réseau
 retourne les paramètres résultats comme dans un retour de procédure.

20/12/2019 8
RMI
Squelette ou Skeleton (sur le serveur)

- déballage des arguments


- Réception de l’invocation Invocation d’une méthode
souche
serveur
- transfert de la réponse Retour de la méthode
- emballage du retour

C’est la procédure sur le site serveur:


 qui reçoit l’appel sous forme de message,
 Reconstruit les arguments à partir de données reçues par le réseau
 fait réaliser l’exécution sur le site serveur par la procédure serveur (choix de la procédure)
 Convertit les valeurs de retour en un format transmissible via le réseau
 retransmet les résultats par message

20/12/2019 9
RMI
Couche des références distantes

 traduit la référence locale au stub en une référence à l’objet distant


 gère les invocations de méthode distante
 repose sur un processus rmiregistry qui centralise les références à des serveurs RMI

20/12/2019 10
RMI
Couche de transport

 assure la connexion avec un hôte distant


 écoute les connexions entrantes
 java.rmi.UnicastRemoteObject utilise les classes Socket et SocketServer

20/12/2019 11
RMI

objet client objet serveur


état
référence
Methode_1
Talon Talon .
appel client serveur
.
Methode_n
Système de communication

Référence d'objet + méthode + arguments

Résultat ou exception

20/12/2019 12
RMI
Exercice

Nous disposons d’un service qui représente un contrôleur de température TemperatureSensor qui offre les
opérations de gestion de la température d’un système industriel.
Les méthodes offertes par ce service sont les suivantes:

void augmenterTemp (double tempVal) { }


void diminuerTemp (double tempVal) { }
double lire_temp () { }

20/12/2019 13
RMI
Interface
package interf;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface TemperatureSensorInterface extends Remote
{
void setTemp (double t) throws RemoteException;

void augmenterTemp (double tempVal) throws RemoteException;

void diminuerTemp (double tempVal) throws RemoteException;

double lire_temp () throws RemoteException;}

20/12/2019 14
Coté Serveur RMI
package serveurTemperature;
import interf.TemperatureSensorInterface;
import java.rmi.*;
import java.rmi.server.*;
public class TemperatureSensor extends UnicastRemoteObject implements TemperatureSensorInterface {
private static final long serialVersionUID = 1L;
private double temp=0;
public TemperatureSensor (double t) throws RemoteException
{ super(); temp=t; }
public void setTemp (double t) throws RemoteException
{ temp=t; }
public void augmenterTemp(double tempVal)
throws RemoteException
{ temp = temp+tempVal;}
public void diminuerTemp (double tempVal)
throws RemoteException
{ temp=temp-tempVal; }
public double lire_temp()
throws RemoteException
{return temp;}}
20/12/2019 15
Coté Serveur RMI
package serveurTemperature;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.registry.LocateRegistry;
public class Serveur {
public static void main(String[] args)
{
try {
//1er
System.out.println("Serveur : Construction de l�impl�mentation");
TemperatureSensor ts= new TemperatureSensor(15.50);
LocateRegistry.createRegistry(2003);
System.out.println("Objet TemperatureSensor enregistr� dans RMIregistry");
Naming.rebind("rmi://localhost:2003/SensorCourant",ts);
System.out.println("Attente des invocations des clients ");
}
catch (Exception e) {
System.out.println("Erreur de liaison de l'objet TemperatureSensor ");
System.out.println(e.toString());
}}}
20/12/2019 16
Coté Client
package clientTemperature;
RMI
import java.io.*;
import java.rmi.*;
import interf.*;
class Client
{public static void main (String [] argv) throws IOException
{System.out.println("Usage : java Client <nombre> <operation>");
//System.setSecurityManager(new RMISecurityManager());
System.out.println("apres security");
// operation = 1: augmenter, 2: diminuer
try {
//System.setSecurityManager(new RMISecurityManager());
TemperatureSensorInterface ts= (TemperatureSensorInterface) Naming.lookup ("rmi://localhost:2003/SensorCourant");
ts.setTemp(5);
ts.augmenterTemp(2);
ts.diminuerTemp(4);
System.out.println ("La temp�rature courante = " + ts.lire_temp() + " degr�s");
ts.diminuerTemp(4);
System.out.println ("La temp�rature courante = " + ts.lire_temp() + " degr�s");
}catch (Exception e) {
System.out.println("Erreur d'acc�s a un objet distant");
20/12/2019 17
System.out.println(e.toString());}}}