Présentation des RMI

Cet article a pour but de rappeler succinctement comment fonctionnent les RMI (appels de méthodes distantes) entre une application Java Serveur et une application Java cliente.

Présentation

  • Stub : Classes qui encodent et envoient les paramètres et les valeurs sur le réseau. Cette classe n’est pas utilisée par le programmeur et est générée manuellement, après compilation du programme serveur via la commande rmic

Nous ne nous attacherons ici qu’à l’utilisation de RMI, implémentée par sun, qui ne permet de communiquer qu’entre objets Java. Une autre implémentation de la gestion d’objets distants existe et peut être utilisée avec des classes C++ : CORBA. Cette implémentation est cependant lente, complexe à mettre en oeuvre, et présente des problèmes d’interopérabilité.

La partie Serveur

/** 
 * Implémente les méthodes de l'interface Produit.
 * UnicastRemoteObject : Rend l'objet accessible à distance. 
 * Cette classe étend RemoteServer, qui crée un thread non démon, lui permettant les appels des clients.
 */
public class ProduitImpl extends UnicastRemoteObject implements Produit { ... }

/** Programme de lancement (<code>main</code>), qui construit et enregistre les ProduitImpl (bind) */
public class ProduitServeur { ... }

La classe Naming

  • Naming.list("") : Liste l’ensemble des noms enregistrés dans les registres RMI.
  • Naming.(re)bind(“nom”,produitImpl) : Enregistre l’objet produitImpl sous le nom “nom” dans les registres RMI. “nom” doit être une chaîne de caractères unique. Le client obtient à la suite de cela un Stub qui permet d’accéder à l’objet.

Le port utilisé pour ce type d’opération est généralement le 1099, et est toujours supérieur à 1024.

Les stubs

Une fois le serveur compilé, il est nécessaire de créer les Stubs.

  • Utiliser la commande rmic sur les classes concernées.

Utilisation d’un gestionnaire de sécurité : En ce qui concerne le serveur, il n’est généralement pas nécessaire d’en utiliser un, à moins que :

  • Nécessité de contraindre les actions du serveur.
  • Le serveur est le client RMI d’un autre serveur.

Le côté client

La classe ProduitClient

  • Contient une interface Produit qui étend java.rmi.Remote. Cette dernière étant partagée par le client et le serveur. Chaque méthode définie dans l’interface doit être en mesure renvoyer une RemoteException (problèmes réseaux).
  • Récupère les objets Produit :
  •  (Produit) Naming.lookup("rmi://hote/nomduRegistre")
  • Il est nécessaire d’utiliser un gestionnaire de sécurité en ce qui concerne le client.
  • On utilisera alors la classe RMISecurityManager de la façon suivante :

    System.setSecurityManager(new RMIsecurityManager());
  • Les applets disposent déjà d’un gestionnaire de sécurité.
  • Le RMISecurityManager empêche les connexions réseau par défaut, il est donc nécessaire de crée un fichier de règles de sécurité, comme par exemple :

    client.policy :
       {
            permission java.net.SocketPermission "*:1024:65535", "connect";
       }
    

Actions de lancement

Il est nécessaire d’effectuer les tâches suivantes dans l’ordre pour mener à bien l’exécution de la communication entre le client et le serveur :

  • Compiler
  • lancer rmic -v1.2 ClasseProduitImpl
  • Démarrer le registre RMI dans une console : rmiregistry
  • Lancer le serveur
  • Lancer le client.

En cas d’échec vérifier les conditions suivantes

  • Le fichier stub se situe dans le dossier du serveur.
  • Le fichier interface se situe dans le dossier client et download
  • le démarrage de rmiregistry : vous étiez dans le répertoire courant (contenant les stub) et le classpath est correct.
  • Existence de règles de sécurité.
  • L’url se termine par un slash.
  • Vous avez bien redémarré rmiregistry si vous avez modifié ou supprimé des classes.
  • configuration des permissions pour un accès répertoire :
permission java.io.FilePermission
{
    "c:\chemin\download\-", "read"
}

* : le signe moins indique les permissions pour l’ensemble des sous répertoires.

Options de lancement

# Enregistre les appels sur la sortie standard :
java -Djava.rmi.server.logCalls=true

# Définit l’emplacement du fichier de règles de sécurité :
java -Djava.security.policy=client.policy

# Définit l’emplacement des stubs :
java -Djava.rmi.server.codebase=http://localhost/download/

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *