Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Accueil ALM Java .NET Dév. Web EDI Programmation SGBD Office Solutions d'entreprise
Applications Mobiles Systèmes Java Java Web Spring Android Eclipse NetBeans
Forums Java FAQs Java Tutoriels Java Livres Java Vidéos Java Sources Java Outils, EDI & API Java JavaSearch
2 1 . L ' a p p e l d e m é t h o d e s d i s t a n t e s : R M I
Niveau : Supérieur
RMI (Remote Method Invocation) est une technologie développée et fournie par Sun à partir du JDK 1.1 pour permettre de mettre en oeuvre facilement
des objets distribués.
C e chapitre contient plusieurs sections :
21.2. Les différentes étapes pour créer un objet distant et l'appeler avec RMI
Le développement coté serveur se compose de :
La définition d'une interface qui contient les méthodes qui peuvent être appelées à distance
L'écriture d'une classe qui implémente cette interface
converted by W eb2PDFConvert.com
L'écriture d'une classe qui instanciera l'objet et l'enregistrera en lui affectant un nom dans le registre de noms RMI (RMI Registry)
21.3.1. La définition d'une interface qui contient les méthodes de l'objet distant
L'interface à définir doit hériter de l'interface java.rmi.Remote. C ette interface ne contient aucune méthode mais indique simplement que l'interface peut
être appelée à distance.
L'interface doit contenir toutes les méthodes qui seront susceptibles d'être appelées à distance.
La communication entre le client et le serveur lors de l'invocation de la méthode distante peut échouer pour diverses raisons telles qu'un crash du
serveur, une rupture de la liaison, etc ...
Ainsi chaque méthode appelée à distance doit déclarer qu'elle est en mesure de lever l'exception java.rmi.RemoteException.
import java.rmi.*;
C ette classe correspond à l'objet distant. Elle doit donc implémenter l'interface définie et contenir le code nécessaire.
C ette classe doit obligatoirement hériter de la classe UnicastRemoteObject qui contient les différents traitements élémentaires pour un objet distant dont
l'appel par le stub du client est unique. Le stub ne peut obtenir qu'une seule référence sur un objet distant héritant de la classe UnicastRemoteObject. On
peut supposer qu'une future version de RMI sera capable de faire du MultiC ast, permettant à RMI de choisir parmi plusieurs objets distants identiques la
référence à fournir au client.
La hiérarchie de la classe UnicastRemoteObject est :
java.lang.Object
java.rmi.Server.RemoteObject
java.rmi.Server.RemoteServer
java.rmi.Server.UnicastRemoteObject
C omme indiqué dans l'interface, toutes les méthodes distantes, mais aussi le constructeur de la classe, doivent indiquer qu'elles peuvent lever l'exception
RemoteException. Ainsi, même si le constructeur ne contient pas de code il doit être redéfini pour inhiber la génération du constructeur par défaut qui ne
lève pas cette exception.
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
21.3.3. L'écriture d'une classe pour instancier l'objet et l'enregistrer dans le registre
C es opérations peuvent être effectuées dans la méthode main d'une classe dédiée ou dans la méthode main de la classe de l'objet distant. L'intérêt d'une
converted by W eb2PDFConvert.com
classe dédiée et qu'elle permet de regrouper toutes ces opérations pour un ensemble d'objets distants.
La marche à suivre contient trois étapes :
C ette opération n'est pas obligatoire mais elle est recommandée en particulier si le serveur doit charger des classes récupérées sur des machines
distantes. Sans security manager, il faut obligatoirement mettre à la disposition du serveur toutes les classes dont il aura besoin (Elles doivent être dans
le C LASSPATH du serveur). Avec un security manager, le serveur peut charger dynamiquement certaines classes.
C ependant, le chargement dynamique de ces classes peut poser des problèmes de sécurité car le serveur va exécuter du code d'une autre machine. C et
aspect peut conduire à ne pas utiliser de security manager.
C ette opération est très simple puisqu'elle consiste simplement en la création d'un objet de la classe de l'objet distant
La dernière opération consiste à enregistrer l'objet créé dans le registre de noms en lui affectant un nom. C e nom est fourni au registre sous forme d'une
URL constituée du préfix rmi://, du nom du serveur (hostname) et du nom associé à l'objet précédé d'un slash.
Le nom du serveur peut être fourni « en dur » sous forme d'une constante chaîne de caractères ou peut être dynamiquement obtenu en utilisant la classe
InetAddress pour une utilisation en locale.
C 'est ce nom qui sera utilisé dans une URL par le client pour obtenir une référence sur l'objet distant.
L'enregistrement se fait en utilisant la méthode rebind de la classe Naming. Elle attend en paramètre l'URL du nom de l'objet et l'objet lui-même.
System.out.println("Serveur lancé");
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
Sur le serveur, le registre de noms RMI doit s'exécuter avant de pouvoir enregistrer un objet ou obtenir une référence.
C e registre peut être lancé en tant qu'application fournie dans le JDK (rmiregistry) comme indiqué dans un chapitre suivant ou être lancé dynamiquement
converted by W eb2PDFConvert.com
dans la classe qui enregistre l'objet. C e lancement ne doit avoir lieu qu'une seule et unique fois. Il peut être intéressant d'utiliser le code ci-dessous si
l'on crée une classe dédiée à l'enregistrement des objets distants.
Le code pour exécuter le registre est la méthode createRegistry() de la classe java.rmi.registry.LocateRegistry. C ette méthode attend en paramètre un
numéro de port.
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.UnknownHostException;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
public class LanceServeur {
21.4.2. L'obtention d'une référence sur l'objet distant à partir de son nom
Pour obtenir une référence sur l'objet distant à partir de son nom, il faut utiliser la méthode statique lookup() de la classe Naming.
C ette méthode attend en paramètre une URL indiquant le nom qui référence l'objet distant. C ette URL est composée de plusieurs éléments : le préfix
rmi://, le nom du serveur (hostname) et le nom de l'objet tel qu'il a été enregistré dans le registre précédé d'un slash.
Il est préférable de prévoir le nom du serveur sous forme de paramètres de l'application ou de l'applet pour plus de souplesse.
La méthode lookup() va rechercher l'objet dans le registre du serveur et retourner un objet stub. L'objet retourné est de la classe Remote (cette classe
est la classe mère de tous les objets distants).
Si le nom fourni dans l'URL n'est pas référencé dans le registre, la méthode lève l'exception NotBoundException.
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
converted by W eb2PDFConvert.com
try {
Remote r = Naming.lookup("rmi://10.0.0.13/TestRMI");
} catch (Exception e) {
e.printStrackTrace();
}
converted by W eb2PDFConvert.com
21.5. La génération de la classe stub
Pour générer la classe stub, il suffit d'utiliser l'outil rmic fourni avec le JDK en lui donnant en paramètre le nom pleinement qualifié de la classe.
Attention la classe doit avoir été compilée : rmic a besoin du fichier .class.
1. Démarrer le registre RMI sur le serveur soit en utilisant le programme rmiregistry livré avec le JDK soit en exécutant une classe qui effectue le
lancement.
2. Exécuter la classe qui instancie l'objet distant et l'enregistre dans le serveur de noms RMI
3. Lancer l'application ou l'applet pour tester.
Exemple :
C:\temp>jar -tf TestRMIClient.jar
META-INF/MANIFEST.MF
com/jmdoudoux/test/rmi/Information.class
com/jmdoudoux/test/rmi/InformationImpl_Stub.class
com/jmdoudoux/test/rmi/LanceClient.class
Le client qui invoque l'objet distant est lancé de manière classique.
Exemple :
converted by W eb2PDFConvert.com
C:\temp>java -jar TestRMIClient.jar
Lancement du client
InformationImpl_Stub[UnicastRef [liveRef: [endpoint:[10.0.0.13:62802](remote),ob
jID:[7b7739e4:135b4a87a5e:-7fff, -3323459310870193038]]]]
chaine renvoyee = bonjour
Fin du client
Exemple :
C:\temp>java -jar TestRMIClient.jar
Lancement du client
java.rmi.ConnectException: Connection refused to host: 10.0.0.13; nested excepti
on is:
java.net.ConnectException: Connection timed out: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.newCall(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Unknown Source)
at com.jmdoudoux.test.rmi.LanceClient.main(LanceClient.java:17)
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown S
ource)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown S
ource)
... 7 more
Fin du client
La partie client peut être lancée avec un gestionnaire et une politique de sécurité associée.
68 commentaires
Copyright (C) 1999-2016 Jean-Michel DOUDOUX. Vous pouvez copier, redistribuer et/ou modifier ce document selon les termes de la Licence
converted by W eb2PDFConvert.com
de Documentation Libre GNU, Version 1.1 ou toute autre version ultérieure publiée par la Free Softw are Foundation; les Sections
Invariantes étant constitués du chapitre Préambule, aucun Texte de Première de Couverture, et aucun Texte de Quatrième de Couverture.
Une copie de la licence est incluse dans la section GNU FreeDocumentation Licence . La version la plus récente de cette licence est
disponible à l'adresse : GNU Free Documentation Licence .
Responsables bénévoles de la rubrique Java : Mickael Baron - Robin56 - Contacter par email
Nous contacter Participez Hébergement Informations légales
Copyright © 2000-2017 - www.developpez.com
converted by W eb2PDFConvert.com