RMI (Remote Method Invocation) est une API Java permettant de manipuler
des objets distants (c'est-à-dire un objet
instancié sur une autre machine virtuelle, éventuellement sur une autre
machine du réseau) de manière transparente
pour l'utilisateur, c'est-à-dire de la même façon que si l'objet
était sur la machine virtuelle (JVM) de la machine locale.
Ainsi un serveur permet à un client d'invoquer des méthodes à
distance sur un objet qu'il instancie. Deux machines virtuelles sont donc
nécessaires (une sur le serveur et une sur le client) et l'ensemble des communications
se fait en Java.
On dit généralement que RMI est une solution "tout Java", contrairement à
la norme Corba de l'OMG (Object Management Group) permettant
de manipuler des objets à distance avec n'importe quel langage. Corba est toutefois
beaucoup plus compliqué à mettre en oeuvre, c'est la raison pour laquelle de nombreux
développeurs se tournent généralement vers RMI.
Les connexions et les transferts de données dans RMI sont effectués par Java
sur TCP/IP grâce à un protocole propriétaire (JRMP, Java
Remote Method Protocol) sur le port 1099.
A partir de Java 2 version 1.3, les communications entre client et serveur s'effectuent
grâce au protocole RMI-IIOP (Internet Inter-Orb Protocol), un protocole normalisé
par l'OMG (Object Management Group) et utilisé dans l'architecture CORBA.
La transmission de données se fait à travers un système de couches,
basées sur le modèle OSI afin de garantir
une interopérabilité entre les programmes et les versions de Java.
- Le stub (traduisez souche) et le skeleton (traduisez squelette), respectivement
sur le client et le serveur, assurent la conversion des communications avec l'objet distant.
- La couche de référence (RRL, remote Reference Layer) est
chargé du système de localisation afin de fournir un moyen aux objets
d'obtenir une référence à l'objet distant. Elle est assurée
par le package java.rmi.Naming. On l'appelle généralement registre RMI
car elle référence les objets.
- La couche de transport permet d'écouter les appels entrants ainsi que d'établir
les connexions et le transport des données sur le réseau
par l'intermédiaire du protocole TCP. Les packages java.net.Socket et
java.net.SocketServer assurent implicitement cette fonction.
Ainsi, une application client-serveur basé sur RMI met ainsi en oeuvre trois composantes :
- une application cliente implémentant le stub
- une application serveur implémentant le skeleton (squelette)
- une application médiatrice (le registre RMI) servie par un processus tiers (rmiregistry)
|