Telechargé par olfa fakhfakh

Etapes RMI

publicité
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
É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 ré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
1/4
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;
}
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
package
service;
5.
6.
import java.rmi.RemoteException;
7.
import
java.rmi.server.UnicastRemoteObject;
import
java.util.Date;
8.
9.
public class BanqueServiceImpl extends UnicastRemoteObject
10.
implements
IBanqueRemote{
11.
12. protected BanqueServiceImpl() throws RemoteException {
super();
13.
// TODO Auto-generated constructor stub
14. }
15.
@Override
16. mt) throws RemoteException {
public double conversion(double
// TODO Auto-generated
method stub
17.
BanqueServiceImpl.java
return 11*mt;
}
@Override
public Date getServerDate() throws RemoteException {
// TODO Auto-generated method stub
return new Date();
}
}
BanqueServiceImpl.java
2/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.
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();
}
ServeurRMI.java
}
}
ServeurRMI.java
3/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
import
import
import
import
java.net.MalformedURLException;
java.rmi.Naming;
java.rmi.NotBoundException;
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());
ClientRMI.java
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ClientRMI.java
4/4
Téléchargement