Applications distribu´ees - 3
Java RMI
Module RCPI01
IUT R&T Rouen
2016-2017
1/20
Sommaire
Introduction
Concepts et description
Exemple
2/20
Introduction
IJava RMI : une API ”orient´ee objet” permettant la construction
d’applications distribu´ees en masquant les aspects transport.
IObjectif de ce CM/TP : pesentation rapide des possibilit´es de cette
techno.
3/20
Probl´ematique : Programmation Orient´ee Objet
IPOO classique : on manipule des objets instanci´es dans la m´emoire
de la machine.
Voiture v = n ew Vo itur e ( ) ;
v . D e ma r re r () ;
v . A c ce l er e r () ;
IApplication r´eparties : les objets sont sur d’autres machines
Comment acceder `a ces objets ? ? ?
ISolution Java : RMI (Remote Method Invocation)
https://docs.oracle.com/javase/7/docs/api/java/rmi/package-
summary.html
4/20
Sommaire
Introduction
Concepts et description
Exemple
5/20
Java RMI
IAPI Java permettant de manipuler des objets distants de la mˆeme
fa¸con que sur la machine locale.
IUn serveur instancie des objets en m´emoire.
IUn client (distant) acc`ede aux objets via une interface, et peut
invoquer des m´ethodes dessus.
ISolution ”tout Java”, contrairement `a CORBA qui peut manipuler
des objets `a distance avec n’importe quel langage.
IMais beaucoup plus simple `a mettre en œuvre.
6/20
Vue en couches
ILes connexions et les transferts de donn´ees dans RMI sont effectu´es
par Java sur TCP/IP grˆace `a un protocole normalis´e :
IJRMP (Java Remote Method Protocol)
Iou RMI-IIOP (Internet Inter-Orb Protocol), protocole h´erit´e de
CORBA
IUne couche interm´ediaire (RRL : Remote Reference Layer) permet
de fournir un service de nommage, permettant de localiser les
objets via leur nom.
(appell´ee aussi ”registre RMI”)
source :CCM
7/20
Organisation logique & vocabulaire
src : JL Massat
8/20
Ecrire une application r´epartie en RMI
IPour chaque objet partag´e, il faudra d´efinir :
Iune classe ”interface”,
Iune classe d’impl´ementation de l’interface.
IIl faudra en sus ´ecrire deux programmes (fonctions main()) :
Ile serveur, qui devra instancier les objets et les mettre `a disposition,
Ile client.
ICompilation : tout sur machine de dev., deploiement `a pr´evoir
IA l’´ex´ecution, il faudra, dans l’ordre :
1. lancer le service d’annuaire (commande rmiregistry),
2. lancer le serveur,
3. lancer le client.
9/20
Attributs publics ?
IL’acc`es aux attributs publics de l’OD n’est pas possible : ils ne sont
pas d´ecrits dans l’interface distante
Il faut ´ecrire des m´ethodes (”getters” et ”setters”) pour
consulter et/ou modifier les attributs d’un OD, et d´eclarer ces
accesseurs dans l’interface.
public class M onMachi n ...
{
public int maValeu r ;
public int ge tMa Val eur () {
return maValeur ;
}
}
10/20
Sommaire
Introduction
Concepts et description
Exemple
11/20
Exemple : Hello World
ICahier des charges :
Ecrire un programme qui ex´ecute sur un objet sa m´ethode
getMessage() (qui renvoie ”Hello World”) et afficher la valeur
renvoee.
IVersion locale : tout sur la mˆeme machine, 2 fichiers (programme +
classe de l’objet).
IVersion distribu´ee avec Java RMI :
Il’objet est cr´ee sur une machine (serveur), qui est en attente
Iune autre machine (client) acc`ede `a l’objet sur le serveur et ex´ecute
la m´ethode sur l’objet
Ile client affiche la valeur renvoee
Il faudra 4 fichiers source.
12/20
Version locale
ILe programme :
Objet ob = new O bj et () ; // creation
Str ing msg = ob . g et Me ssa ge () ; // appel de la
ethode
Syste m . out . p rin tln ( msg ) ; // affichage
ILa classe :
public class Objet
{
public String getMessage ()
{
return " Hello World " ;
}
}
IImplique que l’objet et le programme soient sur la mˆeme machine et
compil´es ensemble.
13/20
Version distribu´ee 1/4 : programme serveur
IProgramme qui cr´ee l’objet RmiObjet et le met `a disposition via le
service de nommage avec le nom monOD
public class R miServe r
{
public static void main ( String args [] )
throws Exception
{
RmiObjet obj = new R mi Ob je t () ;
Nam ing . bind ( " // l oca lh ost / mon OD " , obj ) ;
}
}
Rem : La derni`ere ligne lance un thread cach´e, qui va cr´eer l’objet et
le maintenir en vie : le programme ne va pas s’arrˆeter.
14/20
Version distribu´ee 2/4 : programme client
IR´ecup´eration d’un objet obj de type ObjetIntf via le service de
nom, `a partir du nom monOD
IEx´ecution de sa m´ethode getMessage() et affichage du r´esultat.
public class R miClien t {
public static void main ( String args []) throws
Exception
{
ObjetIntf obj
= ( Obj etIntf ) Naming . lookup (" // local host /
monOD " );
Strin g msg = obj . g et Me ss ag e () ) ;
Syste m . out . p rin tln ( msg ) ;
}
}
15/20
Version distribu´ee 3/4 : interface de l’objet
Ne fait que ecrire ce que l’objet fait.
IInterface de l’objet :
IEcriture d’une classe ObjetIntf de type interface
I´etend” la classe Java Remote avec une m´ethode getMessage()
(non d´efinie ici !)
public inte rface ObjetI ntf extends Remote
{
public String getMessage () throws
Remot eExce ption ;
}
16/20
Version distribu´ee 4/4 : impl´ementation de l’objet
IDoit fournir un constructeur (mˆeme vide), qui lance l’exception
RemoteException()
public class RmiObjet
extends UnicastRemoteObject // classe Java
imp lem ents ObjetIntf // mon interf ace
{
// co ns tr uc teu r ( vide ici )
public RmiObjet () throws Rem oteEx ception
{}
// im pl´em entat ion de la m´etho de
public String getMessage () {
return " Hello World " ;
}
}
17/20
Compilation
IEn pratique : dans les sources, il faudra importer le package RMI via
les lignes suivantes :
import java . rmi .*;
import java . rmi . se rver .*;
import java . rmi . Na ming .*;
18/20
Lancement du service de nommage
IAvant de lancer le serveur, il faut que le service soit lanc´e en
m´emoire.
Ceci se fait depuis le shell :
ISous Linux : rmiregistry&
ISous Windows : start rmiregistry
IOn peut aussi faire en sorte que ce soit le serveur qui le lance au
d´emarrage, via le code suivant :
try {
LocateRegistry.createRegistry(1099);
Syste m . out . p rin tln ( " RMI re gis tr y
created " ) ;
}
catch ( Remo teExc eptio n e ) {
Syste m . out . p rin tln ( " RMI re gis tr y
already exists ." );
}
Rem : il faudra ajouter la ligne import java.rmi.Registry.*;
19/20
Service de nommage
La classe java.rmi.Naming fournit les m´ethodes suivantes :
ICot´e serveur :
Ivoid bind(String name, Remote obj)
R´ef´erencement de l’objet dans le registre RMI.
Ivoid rebind(String name, Remote obj)
Remplacement d’objet dans le registre RMI (ne lance pas d’exception
s’il existe d´ej`a dans le registre)
Ivoid unbind(String name)
Supprime l’association, et termine le thread associ´e `a l’objet.
ICot´e client :
IRemote lookup(String name)
Renvoie une r´ef´erence sur un objet distant (un ”stub”) dans le
registre RMI, `a partir de son nom complet.
IString[] list(String name)
Renvoie un tableau contenant les noms de tous les objets distants
contenus dans le registre RMI
20/20
1 / 5 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !