Académique Documents
Professionnel Documents
Culture Documents
LETHRECH SupMTI
TD RMI
Rappel :
L'implémentation avec RMI d'une application comprenant un objet distant se décompose en
cinq étapes :
1. Ecrire une interface pour l'objet distant. Cette interface représente l'ensemble de
méthodes, via lesquelles un objet distant pourra être manipulé.
2. Ecrire une implémentation de cette interface du cote serveur. Cette classe servira à
créer une instance (l'objet distant) respectant cette interface qui pourra être accédée à
distance depuis la machine cliente. Cette implémentation expose, c'est-à-dire rend
accessible l'objet distant dans un serveur d'objets, qui lui transmettra les appels distants de
méthodes via son squelette.
3. Générer, à partir de la classe implémentant l'interface, les classes souches (du talon et
du squelette) de l'objet distant.
4. Publier l'existence de cet objet exposé dans un serveur de noms, c'est-à-dire associer
cet objet a un nom, a partir duquel des applications distantes clientes pourront récupérer
un talon de cet objet (une instance de la classe du talon généré à l'étape 3).
5. Appeler à distance des méthodes de l'objet distant depuis la machine cliente, déclarées
par l'interface, en utilisant le talon de l'objet exposé.
1
Formation java Pr M. LETHRECH SupMTI
Cette interface expose une seule méthode « sayHello » et prend en paramètre un String.
L'objet distant doit être rendu accessible par le réseau pour que, par exemple, une application
cliente puisse lui transmettre un appel de méthode à distance via un talon. Cette opération,
appelée exposition, peut être réalisée grâce à l'héritage de classes. La classe utilisée est
java.rmi.server.UnicastRemoteObject.
La classe UnicastRemoteObject permet d'exposer des objets du cote serveur afin de les rendre
accessibles, a distance, aux applications clientes. Elle encapsule, de façon transparente pour le
développeur, la prise en charge des objets auprès d'un serveur d'objets. Ce serveur d'objets,
exécuté dans un processus léger, attend les appels de méthodes des clients et les aiguille vers
les instances concernées via leur squelette.
2
Formation java Pr M. LETHRECH SupMTI
Création de l’objet
Un objet distant est crée comme tout autre objet d'une application, instance de la classe
d'implémentation. L'exception RemoteException doit être traitée au cas où une erreur se
produit lors de l'instanciation.
Les méthodes de la classe Naming sont toutes statiques on va utiliser la méthode suivante :
- rebind(url, objet) : une alternative de la méthode bind, permet d'associer un talon a un nom
même si ce dernier est utilise ;
try {
HelloImpl helloImpl = null;
helloImpl = new HelloImpl();
// Bind this object instance to the name "HelloServer"
java.rmi.Naming.rebind(REGISTRY_ENTRY_ID, helloImpl);
System.out.println(":) HelloServer bound in registry at the url ");
System.out.println(" rmi://"+CURRENT_HOSTNAME+"/"+REGISTRY_ENTRY_ID);
} catch (java.net.MalformedURLException e) {
e.printStackTrace();
} catch (java.rmi.RemoteException e) {
System.out.println("!!! --> There is no RMI Registry running on that host : Cannot
bind the HelloServer");
e.printStackTrace();
}
}
3
Formation java Pr M. LETHRECH SupMTI
try {
Hello remoteHelloServer = null;
// get a remote reference (a stub) on the remote server
remoteHelloServer = (Hello) java.rmi.Naming.lookup(args[0]);
if (remoteHelloServer == null) return;
System.out.println(remoteHelloServer.sayHello("Mohammed"));
} catch (java.rmi.NotBoundException e) {
System.out.println("!!! --> HelloServer not bound at the given URL");
e.printStackTrace();
} catch (java.net.MalformedURLException e) {
e.printStackTrace();
} catch (java.rmi.RemoteException e) {
e.printStackTrace();
}
}
}
Compilation
javac Hello.java HelloImpl.java HelloServer.java HelloClient.java
Ou en utilisant *.java
rmic HelloImpl
4
Formation java Pr M. LETHRECH SupMTI
A partir de la version 1.2 de Java, le squelette n'est plus exigé. Pourtant, il peut être généré
pour des questions de compatibilité. A partir de la version 5 de Java, le talon n'est plus
nécessaire, il est généré dynamiquement.
java HelloServer
Résultat :
:) HelloServer bound in registry at the url
rmi://pc/ObjDistant
La méthode d'exposition d'objet distant a pour effet de créer et démarrer le serveur d'objets
dans un processus léger concurrent. Ce serveur d'objets est automatiquement placé en attente
d'appels à distance de méthodes. Pour cette raison, l'exécution du serveur ne rend pas la main,
même après l'affichage des messages (le serveur d'objets reste en attente)
Exercice 2
Utiliser l’exercice précédant pour envoyer un paramètre de type Message.
La classe Message contient deux attributs : date de type Calandar et text de type String
Les paramètres doivent être sérialisés.
Le serveur affiche le text du Message et retourne un accusé de réception qui sera affiché au
niveau du client.
Adapter l’objet distant, le client et le serveur pour utiliser la classe Message comme
paramètre.
Ci-dessous un exemple de la classe Message :
5
Formation java Pr M. LETHRECH SupMTI