<<<M1 - UE2

3 Objets Distants (RMI)

Note : on pourra se référer à l'API JavaSE 7 pour plus de détails.

3.1. Utilisation d'objets distants

Ce concept est lié à l'utilisation d'objets qui rendent un service plutôt que de serveur qui rend un résultat. Même si de prime abord, cela peut apparaître équivalent, les objets distants recellent une problématique plus contraignante, notamment parce que l'on se place du point de vue du paradigme Objet :

Plusieurs méthodes existent

3.2. Remote Method Invocation

RMI pour Remote Method Invocation est une API (Application Programming Interface) Java permettant de manipuler des objets distants (instanciés sur une autre machine du réseau au sein d'une JVM) 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 de la machine locale.

On utilise un modèle client / serveur qui repose sur une interface partagée par client et serveur :

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, 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.

rmi stub

Le 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.

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.

Notamment RMI se charge de la sérialisation des paramètres transmis entre client et serveur.

Par la suite, on se fonde sur un exemple.

3.2.1. stub ou l'interface partagée

On crée une interface qui possède une méthode qui réalise l'addition de deux réels fournis en paramètre. Cette interface devra être disponible sur le client et le serveur.


Warning: file_get_contents(ens/m1/info/ue2/ServiceInterface.java): failed to open stream: No such file or directory in /home/jeanmichel.richer/public_html/html_business.php on line 448
  1.  

3.2.2. l'implémentation

On réalise l'implémentation de l'interface, cette classe sera située sur le serveur.


Warning: file_get_contents(ens/m1/info/ue2/ServiceImpl.java): failed to open stream: No such file or directory in /home/jeanmichel.richer/public_html/html_business.php on line 448
  1.  

Warning: Use of undefined constant   - assumed ' ' (this will throw an Error in a future version of PHP) in /home/jeanmichel.richer/public_html/ensm1i_ue2_pr_cm3.php on line 94

3.2.3. le serveur

Le serveur se charge d'enregistrer le service auprès du RMI Registry (commande Naming.bind).


Warning: file_get_contents(ens/m1/info/ue2/ServiceServer.java): failed to open stream: No such file or directory in /home/jeanmichel.richer/public_html/html_business.php on line 448
  1.  

3.2.4. le client

Le client recherche le service et y fait appel (commande Naming.lookup)


Warning: file_get_contents(ens/m1/info/ue2/ServiceClient.java): failed to open stream: No such file or directory in /home/jeanmichel.richer/public_html/html_business.php on line 448
  1.  

3.2.5. exécution

  1. dans un premier terminal, sur le serveur, lancer le programme rmiregistry qui permet d'enregistrer les services. Le port par défaut du service est 1099, ici on utilise le port 3009 :
    rmiregistry 3009
    	
  2. dans un second terminal (ou sur le serveur), lancer le serveur :
    java ServiceServer
    	
  3. dans un troisième terminal, sur le client, lancer le client :
    java ServiceClient
    	

3.2.5.a  problèmes de permissions

Il se peut que le serveur ne se lance pas ou que le client ne puisse pas contacter le serveur car les droits d'accès n'ont pas été donnés à la JVM. On pourra donc appeler le serveur avec un fichier de droits (policy), comme suit :

java -Djava.security.policy=server.policy ServiceServer

Le fichier des droits server.policy contient les informations suivantes :

grant {
    permission java.net.SocketPermission "localhost:1024-65535", 
    	"connect,accept,resolve";
    permission java.net.SocketPermission "*:80", "connect";
}

3.2.5.b  serveur lançant le rmiregistry

Plutôt que de lancer rmiregistry, puis de lancer le serveur, on peut faire en sorte que le serveur lance rmiregistry :


Warning: file_get_contents(ens/m1/info/ue2/ServiceServerRmiRegistryLaunch.java): failed to open stream: No such file or directory in /home/jeanmichel.richer/public_html/html_business.php on line 448
  1.