1/4
ÉTAPES DE CONSTRUCTION D’APPLICATIONS
RÉPARTIES À BASE D’OBJETS
Invocation de méthodes distantes RMI
Introduction
Ce document résume les étapes à suivre pour construire une application répartie à base
d’objets. Il s’agit d’utiliser un Intergiciel (Middleware) à objets partis java RMI afin
d’invoquer des méthodes distantes. L’objectif est de mettre en œuvre l’une des contraintes de
conception des systèmes répartis : la transparence.
Nous créons un projet « TPRMI_Serveur » qui vise à rendre accessible la méthode
« conversion(...) » à des clients RMI distants. Ce projet contient une interface java
« IBanqueRemote », et les deux classes java « BanqueServiceImpl» et « ServeurRMI ».
Nous créons ainsi un projet « TPRMI_CLIENT» qui invoque la méthode offerte par le
serveur. Ce projet contient la classe « ClientRMI ».
Dans une première étape les deux projets sont exécutés sur la même machine. Par
conséquent l’appel de serveur et de registre par le client se fait à l’adresse interne
"rmi://localhost:1099/...".
Dans la deuxième étape les deux projets sont exécutés sur deux machines distantes. Il faut
créer ensuite un réseau sans fil ad hoc entre les deux machines, et tester la fiabilité de la
connectivité par la commande ping. Il ne faut pas oublier que les deux machines doivent
avoir la même plage d’adresse. (Vous trouvez les étapes à suivre dans l’annexe).
Par exemple, le projet serveur « TPRMI_Serveur » est exécuté sur une machine avec
l’adresse IP 192.168.1.3, Le projet client « TPRMI_CLIENT» est exécuté sur une machine avec
l’adresse IP 192.168.1.5. On utilise le port 1099.
Etapes d’implémentation avec java RMI
Interface IBanqueRemote
1. New projet java TPRMI_Serveur
2. New interface IBanqueRemote , dans un package service
3. L’interface IBanqueRemote hérite de la classe Remote
4. Déclarer les méthodes
Université de Gabes
FACULTE DES SCIENCES DE GABES
Département Informatique
Matière : Systèmes Répartis
Niveau : LFSI. 3
A.U. : 2017 - 2018
Responsable : O. FAKHFAKH
2/4
IBanqueRemote.java
Classe BanqueServiceImpl
1. New Classe BanqueServiceImpl, dans le même package service
2. La classe BanqueServiceImpl hérite de la classe UnicastRemoteObject
3. Implémenter les méthodes déclarées dans l’interface
4. Ajouter un constructeur avec exception : RemoteException
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17. BanqueServiceImpl.java
BanqueServiceImpl.java
package service;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Date;
public interface IBanqueRemote extends Remote{
public double conversion(double mt ) throws RemoteException;
public Date getServerDate() throws RemoteException;
}
package service;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Date;
public class BanqueServiceImpl extends UnicastRemoteObject
implements IBanqueRemote{
protected BanqueServiceImpl() throws RemoteException {
super();
// TODO Auto-generated constructor stub
}
@Override
public double conversion(double mt) throws RemoteException {
// TODO Auto-generated method stub
return 11*mt;
}
@Override
public Date getServerDate() throws RemoteException {
// TODO Auto-generated method stub
return new Date();
}
}
3/4
Classe ServeurRMI
1. New Class ServeurRMI, même package, contient la méthode main
2. Créer un objet distant de la classe BanqueServiceImpl
3. Ajouter try catch car le constructeur de l’objet distant lève l’exception.
4. Publier la référence dans l'annuaire en utilisant la méthode rebind de la classe
Naming. Le premier argument c’est l’adresse de l’annuaire (rmi://localhost s’il
s’agit de la même machine) avec le port. On indique aussi le nom de l’objet
sous lequel est publié l’objet distant. Le deuxième argument présente le nom
de l’objet distant déclaré dans le serveur.
5. Avant de démarrer le serveur, il faut démarrer l'annuaire. Si on veut démarrer
l’annuaire dans le serveur, on utilise une classe qui s’appelle LocateRegistry et
après on démarre l’annuaire avec createRegistry et vous spécifiez le port 1099.
ServeurRMI.java
ServeurRMI.java
package service;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
public class ServeurRMI {
/**
* @param args
*/
public static void main(String[] args) {
try {
LocateRegistry.createRegistry(1099);
BanqueServiceImpl od = new BanqueServiceImpl();
System.out.println(od.toString());
Naming.rebind("rmi:// 192.168.1.3:1099/BK", od);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4/4
Il est à retenir que le serveur RMI démarre l’annuaire, puis il crée l’objet distant,
enfin il publie l’objet distant dans l’annuaire.
Il est à noter que si je crée un objet distant il y a automatiquement la création d’objet
de la classe UnicastRemoteObject. càd pour chaque objet il le crée il crée un squeleton
et le squeleton qui est UnicastRemoteObject ouvre un service d’écoute utilisant un
numéro de port qui est généré automatiquement.
Classe ClientRMI
1. Créer projet TPRMI_CLIENT
2. Copier l'interface IBanqueRemote dans le client
3. Créer Classe CleintRMI avec main
4. Connecter le client à l'annuaire pour communiquer avec l'objet distant. Utiliser
la méthode lookup de la classe Naming. Chercher l’objet distant nommé BK
dans l’annuaire qui se trouve à l’adresse du serveur La méthode lookup
récupère un objet de type object, donc on a besoin de faire un casting vers
l’interface. Créer le stub à partir de la référence récupérée de l’annuaire.
5. Faire appel direct aux méthodes de l'objet distant
ClientRMI.java
ClientRMI.java
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import service.IBanqueRemote;
public class ClientRMI {
public static void main(String[] args) {
try {
IBanqueRemote stub =
(IBanqueRemote) Naming.lookup ("rmi:// 192.168.1.3:1099/BK");
System.out.println(stub.conversion(70));
System.out.println(stub.getServerDate());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
1 / 4 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !