29.10.2014 Views

Programmation par RPC et Java-RMI :

Programmation par RPC et Java-RMI :

Programmation par RPC et Java-RMI :

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

2A-SI - Réseaux :<br />

<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong><strong>RMI</strong><br />

Stéphane Vialle<br />

Stephane.Vialle@supelec.fr<br />

http://www.m<strong>et</strong>z.supelec.fr/~vialle<br />

<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong><br />

<strong>et</strong> <strong>Java</strong>-<strong>RMI</strong> :<br />

- Principes des <strong>RPC</strong><br />

- Utilisation d’un IDL<br />

- Principes des <strong>Java</strong>-<strong>RMI</strong><br />

- Mode opératoire des <strong>Java</strong>-<strong>RMI</strong><br />

- Hiérarchie de classes <strong>Java</strong><br />

- Exemple de client-serveur en <strong>Java</strong>-<strong>RMI</strong><br />

- <strong>RMI</strong> entre plusieurs serveurs<br />

1


<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Principes des <strong>RPC</strong><br />

<strong>RPC</strong> = « Remote Procedure Call »<br />

Objectif : appels locaux <strong>et</strong> distants avec la même syntaxe<br />

• 1ère version : Birrel & Nelson en 1984<br />

– L’utilisateur écrit toute l’application : le client, le serveur <strong>et</strong><br />

les mécanismes d’envoi <strong>et</strong> de réception de messages !!<br />

– Concepts simples, mais complexes à m<strong>et</strong>tre en œuvre<br />

→ Peu utilisé<br />

• SUN <strong>RPC</strong> en 1988<br />

– Plus simple,<br />

– Utilise « rpcgen » : génère une <strong>par</strong>tie des fichiers de <strong>RPC</strong><br />

– Utilise le DNS (localisation du serveur : adresse IP) +<br />

Portmap (localisation du service : # port)<br />

<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Principes des <strong>RPC</strong><br />

Appel<br />

Service <strong>RPC</strong><br />

(talon) Protocole de<br />

communication<br />

1<br />

Réseau<br />

Service <strong>RPC</strong><br />

Protocole de (talon)<br />

communication<br />

2<br />

appel<br />

Appelé<br />

3<br />

5<br />

r<strong>et</strong>our<br />

4<br />

r<strong>et</strong>our<br />

Client (appelant)<br />

Serveur (appelé)<br />

2


<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Principes des <strong>RPC</strong><br />

Talon client : stub<br />

• C’est la procédure<br />

d’interface du site client<br />

qui reçoit l’appel en mode<br />

local<br />

le transforme en appel<br />

distant en envoyant un<br />

message<br />

reçoit les résultats après<br />

l'exécution<br />

r<strong>et</strong>ourne les <strong>par</strong>amètres<br />

résultats comme dans un<br />

r<strong>et</strong>our de procédure<br />

Talon serveur : skel<strong>et</strong>on<br />

• C’est la procédure sur<br />

le site serveur<br />

qui reçoit l’appel sous<br />

forme de message<br />

fait réaliser l’exécution<br />

sur le site serveur <strong>par</strong> la<br />

procédure serveur (choix<br />

de la procédure)<br />

r<strong>et</strong>ransm<strong>et</strong> les résultats<br />

<strong>par</strong> message<br />

<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong><br />

<strong>et</strong> <strong>Java</strong>-<strong>RMI</strong> :<br />

- Principes des <strong>RPC</strong><br />

- Utilisation d’un IDL<br />

- Principes des <strong>Java</strong>-<strong>RMI</strong><br />

- Mode opératoire des <strong>Java</strong>-<strong>RMI</strong><br />

- Hiérarchie de classes <strong>Java</strong><br />

- Exemple de client-serveur en <strong>Java</strong>-<strong>RMI</strong><br />

- <strong>RMI</strong> entre plusieurs serveurs<br />

3


<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Utilisation d’un IDL<br />

• Un langage pour la spécification des interfaces entre<br />

les clients <strong>et</strong> les serveurs :<br />

– Spécification commune au client <strong>et</strong> au serveur<br />

• Le « contrat » entre le client <strong>et</strong> le serveur<br />

– Définition des types <strong>et</strong> natures des <strong>par</strong>amètres<br />

• IN, OUT, IN-OUT, <strong>par</strong> valeur, <strong>par</strong> référence<br />

– Définition indépendante de la plate-forme<br />

• Indépendante du langage, de l’OS <strong>et</strong> de la machine<br />

• Utilisation de ces définitions pour générer<br />

automatiquement :<br />

– Le talon client (ou proxy, ou stub)<br />

– Le talon serveur (ou squel<strong>et</strong>te, ou skel<strong>et</strong>on)<br />

• « projection » dans un langage de programmation<br />

<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Utilisation d’un IDL<br />

Interface<br />

écrite en « IDL »<br />

Client<br />

Compilateur IDL<br />

Serveur<br />

Talon coté client<br />

(Stub)<br />

Talon coté Serveur<br />

(Skel<strong>et</strong>on)<br />

Protocole de<br />

communication<br />

Réseau<br />

Protocole de<br />

communication<br />

4


<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong><br />

<strong>et</strong> <strong>Java</strong>-<strong>RMI</strong> :<br />

- Principes des <strong>RPC</strong><br />

- Utilisation d’un IDL<br />

- Principes des <strong>Java</strong>-<strong>RMI</strong><br />

- Mode opératoire des <strong>Java</strong>-<strong>RMI</strong><br />

- Hiérarchie de classes <strong>Java</strong><br />

- Exemple de client-serveur en <strong>Java</strong>-<strong>RMI</strong><br />

- <strong>RMI</strong> entre plusieurs serveurs<br />

<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Principes des <strong>Java</strong>-<strong>RMI</strong><br />

• Un <strong>RPC</strong> obj<strong>et</strong> intégré à <strong>Java</strong><br />

• Interaction d'obj<strong>et</strong>s situés dans des espaces d'adressage<br />

différents sur des machines distinctes<br />

• Simple à m<strong>et</strong>tre en œuvre : un obj<strong>et</strong> distribué se manipule<br />

comme tout autre obj<strong>et</strong> <strong>Java</strong><br />

• Différences <strong>RPC</strong>/<strong>RMI</strong> :<br />

– Il existe un module de localisation sur le host-serveur distant<br />

(la rmiregistry) : localisation de chaque obj<strong>et</strong>-serveur.<br />

– Les <strong>RMI</strong> sont plus vulnérables aux pannes: impossible de<br />

distinguer le cas de panne du serveur d’un problème réseau<br />

(moins de détails dans les CR d’erreurs).<br />

• Les interfaces (contrats) sont des interfaces <strong>Java</strong><br />

→ L’IDL est <strong>Java</strong> lui-même<br />

5


<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Principes des <strong>Java</strong>-<strong>RMI</strong><br />

obj<strong>et</strong> client<br />

obj<strong>et</strong> serveur<br />

référence<br />

appel<br />

Talon<br />

client<br />

Talon<br />

serveur<br />

état<br />

méthode_1()<br />

méthode_n()<br />

Système de communication<br />

Référence d'obj<strong>et</strong> + méthode + arguments<br />

Résultat ou exception<br />

• désignation<br />

• envoi de requêtes<br />

• exécution de requête<br />

• r<strong>et</strong>our de résultat<br />

<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong><br />

<strong>et</strong> <strong>Java</strong>-<strong>RMI</strong> :<br />

- Principes des <strong>RPC</strong><br />

- Utilisation d’un IDL<br />

- Principes des <strong>Java</strong>-<strong>RMI</strong><br />

- Mode opératoire des <strong>Java</strong>-<strong>RMI</strong><br />

- Hiérarchie de classes <strong>Java</strong><br />

- Exemple de client-serveur en <strong>Java</strong>-<strong>RMI</strong><br />

- <strong>RMI</strong> entre plusieurs serveurs<br />

6


<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Mode opératoire des <strong>Java</strong>-<strong>RMI</strong><br />

0 - A la création de l’obj<strong>et</strong>-serveur, un stub <strong>et</strong> un skel<strong>et</strong>on (avec un port de<br />

communication) sont créés sur le host-serveur<br />

1 - L'obj<strong>et</strong>-serveur s'enregistre auprès du Naming de sa JVM (méthode<br />

rebind)<br />

2 - Le Naming enregistre le stub de l’obj<strong>et</strong> (sérialisé) auprès du serveur de<br />

noms (rmiregistry)<br />

3 - Le serveur de noms est prêt à fournir des références sur l’obj<strong>et</strong>-serveur<br />

Client<br />

Client<br />

rmiregistry<br />

rmiregistry<br />

<br />

stub<br />

stub<br />

<br />

<br />

Naming<br />

Naming<br />

stub<br />

stub<br />

<br />

Serveur<br />

Serveur<br />

JVM Client<br />

Skel<strong>et</strong>on<br />

Skel<strong>et</strong>on<br />

JVM Serveur<br />

<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Mode opératoire des <strong>Java</strong>-<strong>RMI</strong><br />

4 - L'obj<strong>et</strong> client fait appel à son Naming pour localiser l'obj<strong>et</strong>-serveur sur<br />

l’host-serveur (méthode lookup)<br />

5 - Le Naming récupère le stub vers l'obj<strong>et</strong>-serveur auprès de la rmiregistry<br />

6 – Le naming installe l’obj<strong>et</strong> Stub sur le poste client <strong>et</strong> r<strong>et</strong>ourne sa référence<br />

au client<br />

7 - Le client effectue l'appel à l’obj<strong>et</strong> serveur <strong>par</strong> appel à l’obj<strong>et</strong> local Stub<br />

<br />

Client<br />

Client<br />

Naming<br />

Naming<br />

<br />

<br />

rmiregistry<br />

rmiregistry<br />

stub<br />

stub<br />

Naming<br />

Naming<br />

Serveur<br />

Serveur<br />

Stub<br />

Stub Skel<strong>et</strong>on<br />

Skel<strong>et</strong>on <br />

JVM Client<br />

JVM Serveur<br />

7


<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Mode opératoire des <strong>Java</strong>-<strong>RMI</strong><br />

Etapes du développement <strong>et</strong> déploiement :<br />

1. Codage<br />

– description de l’interface du service<br />

– écriture du code du serveur qui implante l’interface<br />

– écriture du client qui appelle le serveur<br />

2. Compilation<br />

– génération des stub <strong>et</strong> skel<strong>et</strong>on (rmic)<br />

– compilation des sources (javac)<br />

3. Activation<br />

– lancement du serveur de noms (rmiregistry)<br />

– lancement du serveur<br />

– lancement du client<br />

<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Mode opératoire des <strong>Java</strong>-<strong>RMI</strong><br />

Etapes du développement <strong>et</strong> déploiement :<br />

1 – programmation: Interface<br />

java<br />

Server.<br />

java<br />

Client.<br />

java<br />

2.1 - rmic Server Server_Stub.class<br />

Server_Skel.class<br />

(2.2 - javac Server.java) Server.class<br />

2.3 - javac Client.java<br />

Client.class<br />

3.1 – rmiregistry<br />

3.2 – java Server<br />

3.3 – java Client<br />

8


<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong><br />

<strong>et</strong> <strong>Java</strong>-<strong>RMI</strong> :<br />

- Principes des <strong>RPC</strong><br />

- Utilisation d’un IDL<br />

- Principes des <strong>Java</strong>-<strong>RMI</strong><br />

- Mode opératoire des <strong>Java</strong>-<strong>RMI</strong><br />

- Hiérarchie de classes <strong>Java</strong><br />

- Exemple de client-serveur en <strong>Java</strong>-<strong>RMI</strong><br />

- <strong>RMI</strong> entre plusieurs serveurs<br />

<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Hiérarchie de classes <strong>Java</strong><br />

Interface :<br />

RemoteObject<br />

Interface :<br />

RemoteServer<br />

Interface :<br />

RemoteStubs<br />

Interface :<br />

Activatable<br />

Classe :<br />

UnicastRemoteObject<br />

Interface :<br />

ActivationGroup_Stub<br />

Serveurs<br />

Stubs/Skel<strong>et</strong>ons<br />

9


<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Hiérarchie de classes <strong>Java</strong><br />

Interface :<br />

RemoteObject<br />

Interface :<br />

RemoteServer<br />

Interface :<br />

RemoteStubs<br />

Interface :<br />

Activatable<br />

Classe :<br />

UnicastRemoteObject<br />

Interface :<br />

ActivationGroup_Stub<br />

• Serveurs démarrés explicitement<br />

• Obj<strong>et</strong>/Service ayant la durée de<br />

vie du processus serveur<br />

• Pour des comm. P2P entre<br />

processus actifs<br />

• Utilise des comm. TCP<br />

Public class MyServerRmi<br />

extends UnicastRemoteObject<br />

Implements MyInterfaceRmi {<br />

…<br />

}<br />

<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Hiérarchie de classes <strong>Java</strong><br />

Interface :<br />

RemoteObject<br />

Interface :<br />

RemoteServer<br />

Interface :<br />

RemoteStubs<br />

Interface :<br />

Activatable<br />

Classe :<br />

UnicastRemoteObject<br />

Interface :<br />

ActivationGroup_Stub<br />

• Serveurs démarrables <strong>par</strong> le<br />

système<br />

• Obj<strong>et</strong>/Service persistant (non liés<br />

à la durée de vie d’un processus)<br />

• Les constructeurs proposent<br />

de définir un port sur lequel<br />

sera exporté le service.<br />

Sinon un port quelconque<br />

sera choisi.<br />

10


<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Hiérarchie de classes <strong>Java</strong><br />

Interface :<br />

RemoteObject<br />

Interface :<br />

RemoteServer<br />

Interface :<br />

RemoteStubs<br />

Interface :<br />

Activatable<br />

Classe :<br />

UnicastRemoteObject<br />

Interface :<br />

ActivationGroup_Stub<br />

• Interfaces à destination des classes « stubs »<strong>et</strong>«skel<strong>et</strong>ons »<br />

(les tallons client <strong>et</strong> serveur générés <strong>par</strong> rmic)<br />

• Gérées <strong>par</strong> le mécanisme des <strong>Java</strong>-<strong>RMI</strong><br />

<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong><br />

<strong>et</strong> <strong>Java</strong>-<strong>RMI</strong> :<br />

- Principes des <strong>RPC</strong><br />

- Utilisation d’un IDL<br />

- Principes des <strong>Java</strong>-<strong>RMI</strong><br />

- Mode opératoire des <strong>Java</strong>-<strong>RMI</strong><br />

- Hiérarchie de classes <strong>Java</strong><br />

- Exemple de client-serveur en <strong>Java</strong>-<strong>RMI</strong><br />

- <strong>RMI</strong> entre plusieurs serveurs<br />

11


<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Ex. client–serveur en <strong>Java</strong>-<strong>RMI</strong><br />

Règles d’écriture des <strong>RMI</strong> :<br />

• Les obj<strong>et</strong>s locaux passés en <strong>par</strong>amètres doivent être (juste)<br />

«serializable»<br />

– Dans la majorité des cas il suffit d’ajouter :<br />

« extends Serializable » dans l’interface de leur classe<br />

« implements Serializable » dans la définition de leur classe<br />

– Rien à faire pour les obj<strong>et</strong>s de base (int, double, …)<br />

– Les obj<strong>et</strong>s difficiles à « serialiser » sont les threads … éviter de<br />

passer des threads en <strong>par</strong>amètres d’appel <strong>RMI</strong> !<br />

<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Ex. client–serveur en <strong>Java</strong>-<strong>RMI</strong><br />

Règles d’écriture des <strong>RMI</strong> :<br />

• Les obj<strong>et</strong>s distants ont plus de contraintes :<br />

– L’interface distante doit être publique<br />

– L’interface distante doit étendre l’interface java.rmi.Remote<br />

– La classe distante hérite (généralement) de<br />

java.rmi.server.UnicastRemoteObject …<br />

… qui implémente java.rmi.Remote (<strong>par</strong>fait!)<br />

– Chaque méthode distante doit déclarer au moins l’exception<br />

java.rmi.RemoteException<br />

• Les obj<strong>et</strong>s distants doivent être déclarés <strong>par</strong> une référence<br />

sur leur interface (uniquement).<br />

12


<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Ex. client–serveur en <strong>Java</strong>-<strong>RMI</strong><br />

Client <strong>Java</strong><br />

rmiregistry<br />

Serveur <strong>Java</strong><br />

« TheServer »<br />

Cas simple :<br />

• Le client connaît le nom du serveur (« TheServer »)<br />

• La rmiregistry est lancée sur le serveur<br />

• Le client passe des arguments « de base » (int)<br />

// l'interface à exporter (deux services définis)<br />

public interface CalculRmi extends java.rmi.Remote {<br />

public int plus(int un, int deux)<br />

throws java.rmi.RemoteException;<br />

public int mult(int un, int deux)<br />

throws java.rmi.RemoteException;<br />

}<br />

<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Ex. client–serveur en <strong>Java</strong>-<strong>RMI</strong><br />

// Client utilisant des services d’un obj<strong>et</strong>-serveur distant<br />

import java.rmi.*;<br />

public class ClientRmi {<br />

static public void main(String arg[])<br />

{<br />

int i1, i2, res;<br />

String NomHostServeur, NomObjServeur;<br />

CalculRmi ObjServeur;<br />

// Parse la ligne de commande<br />

NomHostServeur = arg[0]; NomObjServeur = arg[1];<br />

i1 = Integer.<strong>par</strong>seInt(arg[2]); i2 = Integer.<strong>par</strong>seInt(arg[3]);<br />

try {<br />

// Recherche de l’obj<strong>et</strong>-serveur distant dans la rmiregistry<br />

ObjServeur = (CalculRmi) Naming.lookup(<br />

"rmi://" + NomHostServeur + "/" + NomObjServeur);<br />

// Usage du service distant trouvé<br />

res = ObjServeur.plus(i1, i2);<br />

} catch (Exception e){<br />

System.out.println("Erreur <strong>RMI</strong> " + e.g<strong>et</strong>Message());<br />

System.exit(1);<br />

}<br />

}<br />

}<br />

System.out.println("Résultat appel <strong>RMI</strong>: " + res);<br />

13


<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Ex. client–serveur en <strong>Java</strong>-<strong>RMI</strong><br />

// Obj<strong>et</strong>-Serveur <strong>RMI</strong> (debut)<br />

import java.util.*;<br />

import java.rmi.*;<br />

import java.rmi.server.*;<br />

public class ObjServeurRmi extends<br />

UnicastRemoteObject<br />

implements CalculRmi {<br />

private String nomObjServeur;<br />

public ObjServeurRmi(String s)<br />

throws RemoteException { super();<br />

nomObjServeur = s;<br />

}<br />

public String g<strong>et</strong>NomObjServeur() {<br />

r<strong>et</strong>urn nomObjServeur;<br />

}<br />

<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Ex. client–serveur en <strong>Java</strong>-<strong>RMI</strong><br />

// Obj<strong>et</strong>-Serveur <strong>RMI</strong> (fin)<br />

}<br />

}<br />

// Fonction main : pour le lancement du serveur<br />

static public void main(String arg[]) {<br />

System.s<strong>et</strong>SecurityManager(new <strong>RMI</strong>SecurityManager());<br />

try {<br />

ServeurRmi srmi = new ObjServeurRmi("Calculateur");<br />

Naming.rebind("//localhost/Calculateur", srmi);<br />

System.out.println("Enregistrement obj<strong>et</strong>-serv OK");<br />

} catch (Exception e) {<br />

System.out.println("Pb enregistrement service: " +<br />

e.g<strong>et</strong>Message());<br />

System.exit(1);<br />

}<br />

14


<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong><br />

<strong>et</strong> <strong>Java</strong>-<strong>RMI</strong> :<br />

- Principes des <strong>RPC</strong><br />

- Utilisation d’un IDL<br />

- Principes des <strong>Java</strong>-<strong>RMI</strong><br />

- Mode opératoire des <strong>Java</strong>-<strong>RMI</strong><br />

- Hiérarchie de classes <strong>Java</strong><br />

- Exemple de client-serveur en <strong>Java</strong>-<strong>RMI</strong><br />

- <strong>RMI</strong> entre plusieurs serveurs<br />

<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Mode opératoire des <strong>Java</strong>-<strong>RMI</strong><br />

Déploiement simple entre deux machines distantes :<br />

Client<br />

Stub Server<br />

ObjLoc<br />

…<br />

Res = Server.service(ObjLoc)<br />

…<br />

Obj<strong>et</strong>s locaux :<br />

- passés <strong>par</strong> valeurs<br />

- doivent être serializable<br />

Obj<strong>et</strong>s distants :<br />

- passés <strong>par</strong> « références » : stubs<br />

ObjLoc-copie <strong>par</strong> valeur<br />

Skel<strong>et</strong>on Server ObjServeur<br />

rmiregistry serveur<br />

15


<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong> <strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

Mode opératoire des <strong>Java</strong>-<strong>RMI</strong><br />

Déploiement complexe entre N machines :<br />

➔ invocation dynamique de classe<br />

Client<br />

Stub ObjDist<br />

Stub Server<br />

ObjLoc<br />

Skel<strong>et</strong>on ObjDist<br />

ObjDist<br />

…<br />

Res = Server.service(ObjLoc, « IdObjAndClassDistants »)<br />

…<br />

Invoc. Dyna<br />

Stub ObjDist<br />

Passage d’obj<strong>et</strong>s locaux :<br />

- passés <strong>par</strong> valeurs<br />

ObjLoc-copie <strong>par</strong> valeur<br />

Skel<strong>et</strong>on Server ObjServeur<br />

- doivent être serializable<br />

Passage d’obj<strong>et</strong>s distants :<br />

rmiregistry serveur<br />

- Nécessitent l’invocation dynamique de classes …<br />

<strong>Programmation</strong> <strong>par</strong> <strong>RPC</strong><br />

<strong>et</strong> <strong>Java</strong>-<strong>RMI</strong><br />

FIN<br />

16

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!