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());}}}