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