Title: Invocation de M
1 Invocation de Méthode à distance Exemple
JavaRemote Method Invocation
À travailler seuls
- ESSI
- AM Dery
- Merci à Rémi Vankeisbelck, Michel Riveill etc
Concepts généraux
Mise en œuvre Java
2Plan du cours
- Introduction de la programmation objet à l OD
- Invocation de méthodes distantes
- Description
- Stubs et encodage des paramètres
- Etablissement d une invocation de méthode
distante - Interfaces et implémentations
- Localiser des objets distants
- Conception, implémentation et exécution de
l'exemple - Charger des classes dynamiquement
- Conclusion intermédiaire
3Maturation de la technologie orientée objet
4Objets Messages
Application Collection d objets interagissant
- module logiciel
- indépendance de la programmation et de la
construction - unité autonome
- Méthode comportement des objets
- Message interaction entre objets de
lapplication
5Classes et héritage
Mécanisme dabstraction Généralisation Surcharge
des méthodes par héritage
6Classe et Composition
VEHICULE
CARROSSERIE
MOTEUR
7Objets briques logicielles
- Assembler des briques élémentaires
- Réduire la complexité des systèmes dinformation
Séparation entre interface et implémentation Repr
ésentation et types de données Mécanismes
dabstraction
8Séparation entre interface et implémentation
- séparation de la définition et de
limplémentation encapsulation - interface partie visible de lobjet
- implémentation partie privée inaccessible
depuis dautres objets - interface contrat entre lobjet et le monde
extérieur
9Séparation entre interface et implémentation
- Assemblage des objets dépend uniquement des
interfaces, le changement local dun objet ne
perturbe pas lensemble de lapplication.
Importance de la nomenclature des
objets substitution logique liée à la
substitution physique
10Représentation et Types de données
- Définition de nouveaux types
- Choix dun type pour une donnée (ex. montant)
devient une contrainte sur la conception.
Types de données Abstraits
considérés comme des types de base
11Mécanismes dabstraction
- Abstraction des données essence du procédé de
construction de systèmes d information à base
d objets distribués - par Classe et/ou Composition
Des mises en œuvre différentes selon les cas
12Maturation des communications Client Serveur
- Des programmes (fonctionnant sur des machines
différentes) qui communiquent au travers du
réseau. - Un programme Client envoie des requêtes à un
programme serveur (qui prend en charge
limplémentation)
13Infrastructure Client Serveur
CLIENT
SERVEUR
requêtes
14Client Serveur
15Objets distribués
- Comment trouver une solution ?
- Programmation OO envoi de requêtes entre
plusieurs objets - Ne peut-on pas placer des objets sur différents
ordinateurs de sorte quils puissent s envoyer
directement des messages ?
16Objets distribués
- Un programme (objet) peut être à la fois client
de certains serveurs et serveur dautres clients - Il peut y avoir reconfiguration dynamique des
rôles Client Serveur
17Infrastructure Objets Distribués
Objet2
Objet3
Objet1
Client
Client Serveur
Serveur
18Invocation de méthodes distantes
- Mécanisme qui permet à des objets localisés sur
des machines distantes de séchanger des messages
(invoquer des méthodes)
19Invocation de méthodes distantes
- Semble simple en théorie...
- ... un peu plus complexe en réalité !!!
20RMI
- Heureusement, on utilise Java -)
- Java Remote Method Invocation est la solution à
notre problème - RMI permet à 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, et
ceci de façon quasi transparente !!!
21RMI
- Core API (intégré au JDK 1.1)
- Gratuit
- 100 Java
- Développé par JavaSoft
- Réservé aux objets Java
- Utilise les sockets et le protocole JRMP
22Invocation de méthodes distantes
23Stubs et encodage des paramètres
- le code dun objet client invoque une méthode sur
un objet distant - Utilisation dun objet substitut dans la JVM du
client le stub (souche) de l objet serveur
24Stubs et encodage des paramètres
25Du côté du client
- Appel dune méthode du stub (de façon entièrement
transparente) - le stub construit un bloc de données avec
- identificateur de lobjet distant à utiliser
- description de la méthode à appeler
- paramètres encodés qui doivent être passés
- puis il envoie ce bloc de données au serveur...
26Du côté du serveur
- un objet de réception (Squeleton) effectue les
actions suivantes - décode les paramètres encodés
- situe l objet à appeler
- invoque la méthode spécifiée
- capture et encode la valeur de retour ou
l exception renvoyée par l appel
27Encodage des paramètres
- Encodage dans un bloc d octets afin d avoir une
représentation indépendante de la machine - Types primitifs et basiques (int/Integer...)
- Encodés en respectant des règles établies
- Big Endian pour les entiers...
- Objets ...
28Générateur de stubs
- Les stubs gèrent la communication ainsi que
l'encodage des paramètres - Processus évidemment complexe...
- Entièrement automatique
- Un outil permet de générer les stubs pour les OD
29Stubs et rmic
- La commande rmic du jdk rend transparent la
gestion du réseau pour le programmeur - une référence sur un ODréférence son stub local
- syntaxe un appel local
- objetDistant.methode()
30Un exemple le sempiternel Hello World !!!
31Interfaces et classes prédéfinies
32Interface protocole d application
- L interface HelloWorld
- import java.rmi.
- interface HelloWorld extends Remote
- public String sayHello()
- throws RemoteException
33Rôle de l interface
HelloWorld
HelloWorld
34Les exceptions
- L exception RemoteException doit être déclarée
par toutes les méthodes distantes - Appels de méthodes distants moins fiables que les
appels locaux - Serveur ou connexion peut être indisponible
- Panne de réseau
- ...
35Du côté client
- HelloWorld hello ...
- // Nous verrons par la suite comment obtenir
- // une première référence sur un stub
- String result hello.sayHello()
- System.out.println(result)
36Du côté Serveur
- Implémentation de la classe qui gère les méthodes
de l interface HelloWorld - // Classe d'implémentation du Serveur
- public class HelloWorldImpl
- extends UnicastRemoteObject
- implements HelloWorld
- public String sayHello() throws
RemoteException - String result hello world !!!
- System.out.println( Méthode sayHello
invoquée... result) - return result
-
-
37Classe d implémentation
- doit implanter l interface HelloWorld
- doit étendre la classe RemoteServer du paquetage
java.rmi - RemoteServer est une classe abstraite
- UnicastRemoteObject est une classe concrète qui
gére la communication et les stubs
38Classe d implémentation
HelloWorld
HelloWorld
HelloWorldImpl
39L outil RMIC
- outil livré avec le JDK permet de générer les
stubs - gt rmic -v1.2 HelloWorldImpl
- génère un fichier HelloWorldImpl_stub.class
- rmic doit être passé pour toutes les classes
d'implémentation des OD afin d'en générer les
stubs
40Référence sur un objet
- On sait implanter un serveur d un côté, et
appeler ses méthodes de l autre - MAIS
- Comment obtient-on une référence vers un stub de
notre objet serveur ???
41Localisation des objets de serveur
- On pourrait appeler une méthode sur un autre
objet serveur qui renvoie une référence sur le
stub... - Mais quoi qu il en soit, le premier objet doit
lui aussi être localisé (La poule et l œuf) !!! - On a alors recours a un Service de Nommage
42Les Services de Nommage
- Obtention d'une première référence sur un objet
distant bootstrap à laide dun Service de
Nommage ou Annuaire - Enregistrement des références d'objets dans
l'annuaire afin que des programmes distants
puissent les récupérer
43Exemple Le RMIRegistry
- Implémentation d'un service de nommage
- Fourni en standard avec RMI
- Permet d'enregistrer des références sur des
objets de serveur afin que des clients les
récupèrent - On associe la référence de l'objet à une clé
unique (chaîne de caractères) - Le client effectue une recherche par la clé, et
le service de nommage lui renvoie la référence
distante (le stub) de l'objet enregistré pour
cette clé
44Le RMIRegistry
- Programme exécutable fourni pour toutes les
plates formes - S'exécute sur un port (1099 par défaut) sur la
machine serveur - Pour des raisons de sécurité, seuls les objets
résidant sur la même machine sont autorisés à
lier/délier des références - Un service de nommage est lui-même localisé à
l'aide d'une URL
45La classe Naming
- du package java.rmi
- permet de manipuler le RMIRegistry
- supporte des méthodes statiques permettant de
- Lier des références d'objets serveur
- Naming.bind(...) et Naming.rebind(...)
- Délier des références d'objets serveur
- Naming.unbind(...)
- Lister le contenu du Naming
- Naming.list(...)
- Obtenir une référence vers un objet distant
- Naming.lookup(...)
46Enregistrement d une référence
- L objet serveur HelloWorld (coté serveur bien
entendu) - On a créé l'objet serveur et on a une variable
qui le référence - HelloWorld hello new HelloWorldImpl()
- On va enregistrer l'objet dans le RMIRegistry
- Naming.rebind("HelloWorld",hello)
- L'objet est désormais accessible par les clients
47Obtention d'une référence coté client
- sur l'objet serveur HelloWorld
- On déclare une variable de type HelloWorld et on
effectue une recherche dans l'annuaire -
- HelloWorld hello (HelloWorld)Naming.lookup("rmi
//www.helloworldserver.com/HelloWorld") - On indique quelle est l'adresse de la machine sur
laquelle s'exécute le RMIRegistry ainsi que la
clé - La valeur retournée doit être transtypée (castée)
vers son type réel
48Remarque
- Le Service de Nommage n'a pas pour fonction le
référencement de tous les objets de serveur - Il devient vite complexe de gérer l'unicité des
clés - La règle de bonne utilisation du Naming est de
lier des objets qui font office de point
d'entrée, et qui permettent de manipuler les
autres objets serveurs
49Conception, implémentation et exécution de
l'exemple
- Rappel
- On veut invoquer la méthode sayHello() d'un objet
de serveur distant de type HelloWorld depuis un
programme Java client - Nous allons devoir coder
- L'objet distant
- Le serveur
- Le client
- Et définir les permissions de sécurité et autres
emplacements de classes...
50Processus de développement
- 1) définir une interface Java pour un OD
- 2) créer et compiler une classe implémentant
cette interface - 3) créer et compiler une application serveur RMI
- 4) créer les classes Stub (rmic)
- 5) démarrer rmiregistry et lancer lapplication
serveur RMI - 6) créer, compiler et lancer un programme client
accédant à des OD du serveur
51Hello World L'objet distant
- Une interface et une classe d'implémentation
- stubs générés automatiquement par rmic
- toutes les classes nécessaires à l objet de
client doivent être déployées sur la machine
cliente et accessibles au chargeur de classes
(dans le CLASSPATH) - L'interface HelloWorld (HelloWorld.class)
- Le stub HelloWorldImpl_stub généré par rmic pour
cet objet
52Hello World Le serveur
- instancie un objet de type HelloWorld et attache
au service de nommage - puis objet mis en attente des invocations jusqu'à
ce que le serveur soit arrêté - import java.rmi.
- import java.rmi.server.
- public class HelloWorldServer
- public static void main(String args)
- try
- System.out.println("Création de l'objet
serveur...") - HelloWorld hello new HelloWorldImpl()
- System.out.println("Référencement dans le
RMIRegistry...") - Naming.rebind("HelloWorld",hello)
- System.out.println("Attente d'invocations -
CTRL-C pour stopper") - catch(Exception e)
- e.printStackTrace()
-
-
53Serveur (suite)
- Apres avoir compilé le tout...
- Pour démarrer le serveur, il faut tout d'abord
lancer le RMIRegistry - Attention La base de registres RMI doit
connaître les interfaces et les stubs des objets
qu'elle enregistre (CLASSPATH) !!! - gt rmiregistry
- et ensuite on lance le serveur
- gt java HelloWorldServer
-
- Création de l'objet serveur...
- Référencement dans le RMIRegistry...
- Attente d'invocations - CTRL-C pour stopper
54Hello World client
- obtenir une référence sur l'objet de serveur
HelloWorld, invoquer la méthode sayHello(), puis
afficher le résultat de l'invocation sur la
sortie standard - import java.rmi.
- public class HelloWorldClient
- public static void main(String args)
- try
- System.out.println("Recherche de l'objet
serveur...") - HelloWorld hello
- (HelloWorld)Naming.lookup("rmi//server/Hell
oWorld") System.out.println("Invocation de la
méthode sayHello...") - String result hello.sayHello()
- System.out.println("Affichage du résultat
") - System.out.println(result)
- System.exit(0)
- catch(Exception e)
- e.printStackTrace()
-
-
-
55Le client (suite)
- Il suffit ensuite de lancer le programme
- gt java HelloWorldClient
-
- Recherche de l'objet serveur...
- Invocation de la méthode sayHello...
- Affichage du résultat
- hello world !!!
- Au niveau du serveur, le message...
- Méthode sayHello invoquée... hello world !!!
- ...s'affichera dans la console
56Que doit connaître le client ?
- Lorsqu un objet serveur est passé à un
programme, soit comme paramètre soit comme valeur
de retour, ce programme doit être capable de
travailler avec le stub associé - Le programme client doit connaître la classe du
stub
57Que doit connaître le client ?
- les classes des paramètres, des valeurs de retour
et des exceptions doivent aussi être connues... - Une méthode distante est déclarée avec un type de
valeur de retour... - ...mais il se peut que l objet réellement
renvoyé soit une sous-classe du type déclaré
58Que doit connaître le client ?
- Le client doit disposer des classes de stub,
classes des objets retournés - copier les classes sur le système de fichiers
local du client (CLASSPATH)... - ...cependant, si le serveur est mis à jour et que
de nouvelles classes apparaissent, il devient
vite pénible de mettre à jour le client - C est pourquoi les clients RMI peuvent charger
automatiquement des classes de stub depuis un
autre emplacement - Il s agit du même type de mécanisme pour les
applets qui fonctionnent dans un navigateur
59Chargement dynamique des classes
- Problème de sécurité
- Le programme client télécharge du code sur le
réseau - Ce code pourrait contenir des virus ou effectuer
des opérations non attendues !!! - Utilisation d un gestionnaire de sécurité pour
les applications de clients RMI - Possibilité de créer des gestionnaires de
sécurité personnalisés pour des applications
spécifiques - RMI fournit des gestionnaires de sécurité
suffisants pour un usage classique
60Chargement dynamique
- Pour ne plus déployer les classes du serveur chez
le client - Utilisation des chargeurs de classes qui
téléchargent des classes depuis une URL - Utilisation d un serveur Web qui fournit les
classes - Ce que ça change
- Bien entendu, les classes et interfaces de l
objet distant ne changent pas - Le code du serveur ne change pas
- le client et la façon de le démarrer sont
modifiés - Et lancer un serveur Web pour nos classes
61Hello World chargement dynamique
- Séparation des classes
- Serveur (fichiers nécessaires a l'exécution du
serveur) - HelloWorldServer.class
- HelloWorldImpl.class
- HelloWorld.class
- HelloWorldImpl_Stub.class
- Download (fichiers de classes à charger dans le
programme client) - HelloWorldImpl_Stub.class
- Client (fichiers nécessaires au démarrage du
client) - HelloWorld.class
- HelloWorldClient.class
62Hello World Démarrage du serveur Web
- Mettre les classes Download dans le répertoire
des documents Web du serveur Web, accessibles via
une URL - le chargeur de classes ira chercher les classes à
un emplacement de type http//www.class-server.com
/classes/HelloWorldImpl_Stub.class -
63Hello World Politiques de sécurité
- Le programme Java client doit pouvoir se
connecter aux ports de la base de registres RMI
et des implémentations des objets de serveur,
ainsi qu'au port du serveur Web - Fichier client.policy
- grant
- permission java.net.SocketPermission
- "1024-65535", "connect,resolve"
- permission java.net.SocketPermission
- "80", "connect"
-
64Hello World gestionnaire de sécurité RMI
- Le client intègre un gestionnaire de sécurité RMI
pour les stubs téléchargés dynamiquement - import java.rmi.
- import java.rmi.server.
- public class HelloWorldClient
- public static void main(String args)
- try
- // Installe un gestionnaire de sécurité RMI
- System.setSecurityManager(new
RMISecurityManager()) - System.out.println("Recherche de l'objet
serveur...") - HelloWorld hello
- (HelloWorld)Naming.lookup("rmi//server/Hell
oWorld") System.out.println("Invocation de la
méthode sayHello...") - String result hello.sayHello()
- System.out.println("Affichage du résultat
") - System.out.println(result)
- catch(Exception e)
- e.printStackTrace()
65Hello World Démarrage coté serveur
- 1) Lancer la base de registres RMI (elle doit
pouvoir accéder aux classes Download - CLASSPATH) - gt rmiregistry
- 2) Lancer le serveur Web servant les fichiers de
classes Download - 3) Lancer le serveur (les classes Server doivent
être accessibles) - gt java HelloWorldServer
- Création de l'objet serveur...
- Référencement dans le RMIRegistry...
- Attente d'invocations - CTRL-C pour stopper
66Hello World Démarrage coté client
- Le client doit pouvoir se connecter à des
machines distantes pour la base de registres RMI,
les objets de serveur ainsi que le serveur Web - On doit lui fournir un fichier client.policy
- Le client doit bien connaître l'emplacement des
classes afin de pouvoir les télécharger - On va le lui préciser lors du lancement
- gt java -Djava.security.policyclient.policy
- -Djava.rmi.server.codebasehttp//www.class-serve
r.com80/ - HelloWorldClient
67Passage de paramètres
- On sera souvent amenés a passer des paramètres
aux méthodes distantes... - Les méthodes distantes peuvent retourner une
valeur ou lever une exception... - On a deux types de paramètres
- Les objets locaux
- Les objets distants
68Passage de paramètres ATTENTION
- Certains objets sont copiés (les objets locaux),
d'autres non (les objets distants) - Les objets distants, non copiés, résident sur le
serveur - Les objets locaux passés en paramètre doivent
être sérialisables afin d'être copiés, et ils
doivent être indépendants de la plate-forme - Les objets qui ne sont pas sérialisables lèveront
des exceptions - Attention aux objets sérialisables qui utilisent
des ressources locales !!!
69Conclusion intermédiaire
- On a vu ce qu'est une invocation de méthode
distante - On a vu le mécanisme des stubs, ainsi que
l'encodage des paramètres - On a vu le déploiement avec téléchargement des
classes dynamiquement - Nous avons même appliqué ces concepts au travers
de l'exemple "HelloWorld en RMI
70Appel de Procédure à Distance
CLIENT
SERVEUR
F(1, x)
F(1,x)
unmarshalling
marshalling
10
marshalling
unmarshalling
71Langages de spécifications
- Spécifications des types de données qui
transitent sur le réseau
Protocole CHOICE
requete 0 REQUETE,
reponse 1 REPONSE
ASN.1 et norme ISO
Programme protocol version REPONSE
rerep(REQUETE) 1 1 10000
72Générateurs de Stubs
Spécifications des données
XDR
ASN1
Générateurs
RPCGEN / MAVROS
Fichiers générés
Librairie marshalling et unmarshalling squelettes
du client et du serveur
Types de données C Lisp Java
Types de données C
73Quelques bouquins...
- Core Java Volume 2
- Par Cay S. Horstmann Gary Cornell
- Editions CampusPress
- Une référence pour les développeurs Java
- Bonne section sur RMI, servi de base pour ce
cours - Java Distributed Computing
- Par Jim Farley
- Editions O'Reilly
- Tout sur les applications reparties avec Java
- Plus technique...