Programmation par RPC et Java-RMI :
Programmation par RPC et Java-RMI :
Programmation par RPC et Java-RMI :
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