Académique Documents
Professionnel Documents
Culture Documents
Car Rmi
Car Rmi
INSAT 2009-2010
Intérêt des objets pour la construction d’applications
réparties
Encapsulation
• L’interface (méthodes + attributs) est la seule voie d’accès à l’état interne, non
directement accessible
Classes et instances
• Mécanismes de génération d’exemplaires conformes à un même Modèle
Héritage
• Mécanisme de spécialisation : facilite récupération et réutilisation de l’existant
Polymorphisme
• Mises en œuvre diverses des fonctions d’une interface
• Remplacement d’un objet par un autre si interfaces
• Facilite l’évolution et l’adaptation des applications
voir http://java.sun.com/docs/books/tutorial/rmi/
Invocation méthode
Invocation méthode
Lorsqu'un objet instancié sur une machine cliente désire accèder à des
méthodes d'un objet distant, il effectue les opérations suivantes :
• il localise l'objet distant grâce à un service de nommage: le registre RMI
• il obtient dynamiquement une image virtuelle de l'objet distant (appelée stub ou
souche en français). Le stub possède exactement la même interface que l'objet
distant.
• Le stub transforme l'appel de la méthode distante en une suite d'octets, c'est ce que
l'on appelle la sérialisation, puis les transmet au serveur instanciant l'objet sous forme
de flot de données. On dit que le stub "marshalise" les arguments de la méthode
distante.
• Le squelette instancié sur le serveur "désérialise" les données envoyées par le stub (on
dit qu'il les "démarshalise"), puis appelle la méthode en local
• Le squelette récupère les données renvoyées par la méthode (type de base, objet ou
exception) puis les marshalise
• le stub démarshalise les données provenant du squelette et les transmet à l'objet
faisant l'appel de méthode à distance
Permet d'enregistrer des références sur des objets de serveur afin que des
clients les récupèrent
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
Interface
• L’interface d’un objet distant (Remote) est celle d’un objet Java, avec quelques règles
d’usage :
• L’interface distante doit être publique
• L’interface distante doit étendre l’interface java.rmi.Remote
• Chaque méthode doit déclarer au moins l’exception java.rmi.RemoteException
Passage d’objets en paramètre
• Les objets locaux sont passés par valeur (copie) et doivent être sérialisables (étendent
l’interface java.io.Serializable)
• Les objets distants sont passés par référence et sont désignés par leur interface
Exécution
• Lancer le serveur de noms (sur la machine serveur)
rmiregistry &
N.B. Par défaut, le registry écoute sur le port 1099. Si on veut le placer sur un autre port, il suffit de
l’indiquer, mais il faut aussi modifier les URL en conséquence :
rmi://<serveur>:<port>/<répertoire>
• Lancer le serveur
java -Djava.rmi.server.codebase=http://<addresse>/<répertoire des classes> -D
java.security.policy=java.policy <Server> &
N.B. Signification des propriétés (option -D) :
– Le contenu du fichier java.policy spécifie la politique de sécurité.
• Lancer le client
java -Djava.security.policy=java.policy <Client>
N.B. Le talon client sera chargé par le client depuis le site du serveur, spécifié dans l’option codebase lors du
lancement du serveur
helloworld
import import
helloworld.client Helloworld.intfc helloworld.server
L ’interface HelloWorld
import java.rmi.*;
interface HelloWorld extends Remote
{
public String sayHello() throws RemoteException;
}
HelloWorld
System.out.println(result);
HelloWorld
HelloWorldImpl
rmic doit être passé pour toutes les classes d'implémentation des Object
Distribués afin d'en générer les stubs
Naming.rebind("HelloWorld",hello);
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... »
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
puis objet mis en attente des invocations jusqu'à ce que le serveur soit arrêté
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é
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é
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
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
Mettre les classes Download dans le répertoire des documents Web du serveur
Web, accessibles via une URL
Fichier client.policy
grant
{
permission java.net.SocketPermission "*:1024-65535", "connect,resolve";
};
1. Lancer la base de registres RMI (elle doit pouvoir accéder aux classes
Download - CLASSPATH)
> rmiregistry
2. Lancer le serveur Web servant les fichiers de classes Download
3. Lancer le serveur (les classes Server doivent être accessibles)
> java HelloWorldServer
Création de l'objet serveur...
java.rmi.ServerException: RemoteException
occurred in server ...
java.rmi.UnmarshalException: error
unmarshalling ...
java.lang.ClassNotFoundException:
Le stub est accessible au serveur MAIS PAS AU rmiregistry
Attention à l’ordre d’appel : génération des stubs et appel du rmiregistry
rmiregistry pas lancé
java.net.ConnectException
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
Client
Registry registry;
registry = LocateRegistry.getRegistry();
Serveur
LocateRegistry.createRegistry(port); // port=1099