Your SlideShare is downloading. ×
0
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Chapitre 5 : les objets répartis avec Java Rmi
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Chapitre 5 : les objets répartis avec Java Rmi

117

Published on

RMI est une API: un ensemble de clases et méthodes que l’on trouve dans (java.rmi) et qui servent à développer des applications distribuées en Java ayant la même syntaxe que des applications non …

RMI est une API: un ensemble de clases et méthodes que l’on trouve dans (java.rmi) et qui servent à développer des applications distribuées en Java ayant la même syntaxe que des applications non distribuées dans différents processus (en général sur différentes machines)…

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
117
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
20
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Chapitre 5 : Les objets répartis avec Java RMI Pr : Hassan Bahi 1
  • 2. Pr : Hassan Bahi Plan 1. Introduction 2. Présentation Objectifs 3. Architecture de RMI 4. Fonctionnement de RMI 5. Etapes de développement 2
  • 3. Introduction Le rêve de tout système distribué L’idéal serait d’avoir un système distribué utilisant la technologie objet et permettant : o d’invoquer une méthode d’un objet se trouvant sur une autre machine exactement de la même manière que s’il se trouvait au sein de la même machine : objetDistant.methode() ; o d’utiliser un objet distant (OD), sans savoir où il se trouve, en demandant à un service « dédié » de renvoyer son adresse : objetDistant = ServiceDeNoms.recherche("monObjet"); 3
  • 4. Introduction o De pouvoir passer un OD en paramètre d’appel à une méthode locale ou distante : resultat = objetLocal.methode(objetDistant); resultat = objetDistant.methode(autreObjetDistant); o De pouvoir récupérer le résultat d’un appel distant sous forme d’un nouvel objet qui aurait été créé sur la machine distante : ObjetDistant = ObjetDistant.methode() ; 4
  • 5. Introduction Le rêve devient réalité … avec Java qui va répondre à tous ces besoins par 2 offres : o JOE (Java Object Environment : offre compatible CORBA) est destiné à des applications distribuées faisant interagir des objets Java avec d’autres objets non Java (Chapitre 6) o RMI (Remote Method Invocation) est un système d’objets distribués performant destiné au développement d’applications distribuées entièrement en Java 5
  • 6. Présentation RMI: o Développer des applications client/serveur en utilisant des sockets nous ramène à développer un protocole de langage commun entre le client et le serveur. Développer se protocole n’est pas toujours simple et est surtout long. o Au lieux de travailler directement avec les sockets, les applications clients/serveurs, peuvent être développés au moyen de l’invocation des méthodes objets qui sont en train de s’éxecutés dans une autre machine 6
  • 7. Présentation RMI: o RMI est une API: un ensemble de clases et méthodes que l’on trouve dans (java.rmi) et qui servent à développer des applications distribuées en Java ayant la même syntaxe que des applications non distribuées dans différents processus (en général sur différentes machines)… 7 Objet A Machine 1 Application X Objet B Machine 2 Application Y
  • 8. Objectifs de RMI: o Rendre transparent l’accès à des objets distribués sur un réseau : Un appel de méthode sur un objet distant doit être syntaxiquement le même qu’un appel de méthode sur un objet local :  Idée : masquer (au programmeur) les communications nécessaires dans un objet : • dont l’interface est exactement celle de l’objet distant • qui délègue tous les appels, à travers le réseau, à l’objet distant… o Faciliter la mise en œuvre et l’utilisation d’objets distants Java 8
  • 9. Architecture de RMI : o Les connexions et les transferts de données dans RMI sont effectués par Java sur TCP/IP grâce à un protocole propriétaire (JRMP, Java Remote Method Protocol) sur le port 1099. o La transmission de données se fait à travers un système de couches, basées sur le modèle OSI afin de garantir une interopérabilité entre les programmes et les versions de Java. 9
  • 10. Fonctionnement de RMI : côté serveur 1. L'objet serveur est créé, si nécessaire il crée l’objet squelette, puis le port de communication est ouvert. 10 squelette Serveur 1 1
  • 11. Fonctionnement de RMI : côté serveur 2. L'objet serveur s'enregistre auprès du service de noms RMI via la classe Naming de sa JVM (méthode bind ou rebind). 11 Naming 2 squelette Serveur 1 1
  • 12. Fonctionnement de RMI : côté serveur 3. Le Naming enregistre le nom de l’objet serveur et une souche client (contenant l’@IP et le port de comm.) dans le rmiregistry 12 Naming 2 rmiregistry 3 squelette Serveur 1 1
  • 13. Fonctionnement de RMI : côté client 4. L'objet client fait appel au Naming de sa JVM pour localiser l'objet serveur (méthode lookup) 13 Naming 2 rmiregistry 3 squelette Serveur 1 1 Client 4 Naming
  • 14. Fonctionnement de RMI : côté client 5. Le Naming récupère la souche client de l'objet serveur, … 14 Naming 2 rmiregistry 3 squelette Serveur 1 1 Naming Souche C. Client 4 5 5
  • 15. Fonctionnement de RMI : côté client 6. Le client appelle des méthodes de l'objet serveur au travers de la souche, qui crée un port de communication, et du squelette éventuel. 15 Naming 2 rmiregistry 3 squelette Serveur 1 1 Naming Souche C. Client 4 5 5 6 6 6 6
  • 16. Fonctionnement de RMI : Skeleton / Stub Skeleton (squelette) : o Invoque des méthodes sur l'objet local référencé pour le compte d'une souche. o Convertit les valeurs de retour en un format transmissible via le réseau o Reconstruit les arguments à partir de données reçues par le réseau Stub (Souche) : o Représentent objet distant o Convertit les arguments en un format transmissible via le réseau o Reconstruit les valeurs de retour à partir de données reçues par le réseau 16
  • 17. Fonctionnement de RMI : Lorsqu'un objet instancié sur une machine cliente désire accéder à des méthodes d'un objet distant, il effectue les opérations suivantes : 1. Il localise l'objet distant grâce à un service de nommage: le registre RMI 2. Il obtient dynamiquement une image virtuelle de l'objet distant (appelée stub ou souche en français).Le stub possède exactement la même interface que l'objet distant. 3. Le stub transforme l'appel de la méthode distante en une suite d'octets, c'est ce que Fonctionnement de RMI l'on appelle la sérialisation, puis les transmet au serveur instanciant l'objet sous forme de flot de données. On dit que le stub " sérialises " les arguments de la méthode distante. 4. Le squelette instancié sur le serveur " désérialise " les données envoyées par le stub puis appelle la méthode en local 5. Le squelette récupère les données renvoyées par la méthode (type de base, objet ou exception) puis les sérialises 6. le stub désérialise les données provenant du squelette et les transmet à l'objet faisant l'appel de méthode à distance 17
  • 18. Etapes de développement 1. Définition de l'interface de l'objet distant : o Interface héritant de java.rmi.Remote o Les méthodes de cette interface doit préciser dans sa signature qu'elle peut lever l'exception RemoteException o Paramètres de type simple, objets Sérialisables (implements Serializable) ou Distants (implements Remote) 2. Ecrire une implémentation : o Classe héritant de java.rmi.server.UnicastRemoteObject et implémentant l'interface précédente. o écrire un main permettant l'enregistrement auprès du Naming 3. Ecriture d'un client : o Utilisation du Naming pour trouver l'objet distant o Appel(s) de méthodes 18
  • 19. Etapes de développement Classe registry o Un client doit pouvoir récupérer une référence sur l'objet distant implémentant l'interface:  Utilise les services du « registry » (registre, annuaire ...)  Le registry est lancé à part à coté des applis (client , serveur) Java  Un objet accède au registry via la classe Naming o L’identification d'un objet distant se fait via une URL de la forme : rmi://hote:port/nomObj:  hote : nom de la machine distante (sur laquelle tourne un registry), par défaut localhost  port : port sur lequel écoute le registry. Par défaut le port est celui utilisé par le registry (1099)  nomObj : nom donné à un objet offrant des opérations o Si pas précision du port : port par défaut utilisé par le registry (1099) o Si pas précision de l'hôte : registry local par défaut (localhost) 19
  • 20. Etapes de développement Lancement du registry - Unix/Linux : $ rmiregistry [port] - Windows : > start rmiregistry [port]  En paramètre, on peut préciser un numéro de port : port d'écoute du registry - En Java: un objet Java peut à l'exécution lancer un registry : public static Registry createRegistry(int port) throws RemoteException :  Lance un registry localement sur le port d'écoute passé en paramètre 20
  • 21. Etapes de développement : Classe Naming - Cette classe gère le service de nommage - Méthodes: o static void bind(String name, Remote obj): - Enregistre l’objet sous le nom name (erreur si déjà un objet avec ce nom). o static void rebind(String name, Remote obj): - Enregistre un objet sous le nom name, en écrasant la précédente liaison objet/nom si elle existait. o static Remote lookup(String name): - Retourne une référence sur l'objet dont le nom est passé en paramètre. o static void unbind(String name): - Supprime du registry la référence vers l'objet nommé name. 21
  • 22. Etapes de développement 22 Client Serveur 1 : HelloWord.sayHello() 2 : Analyse et traitement de la requête 3 : renvoie une string contenant « Hello word !» 4 : Affiche le résultat sur la sortie standard
  • 23. Etapes de développement Processus de développement d’une application RMI 1. Définir une interface Java pour un objet distant 2. Créer et compiler une classe implémentant cette interface 3. Créer et compiler une application serveur RMI 4. Créer les classes Stub et Skeleton (rmic) 5. Démarrer rmiregister et lancer l’application serveur RMI 6. Créer, compiler et lancer un programme client accédant à des objets distants du serveur 23
  • 24. Etapes de développement : Exemple Définition d’interface : HelloInterface.java 24 import java.rmi.*; public interface HelloInterface extends Remote { /* méthode qui imprime un message prédéfini dans l’objet appelé */ public String sayHello() throws java.rmi.RemoteException; } Signifie que la méthode sayHello pourra être appelée depuis une JVM autre que la JVM locale.
  • 25. Etapes de développement : Exemple Classe réalisant l’interface : HelloImpl.java 25 import java.rmi.*; import java.rmi.server.*; public class HelloImpl extends UnicastRemoteObject implements HelloInterface { private String message; /* le constructeur */ public HelloImpl (String s) throws RemoteException { super(); message = s ; } /* l’implémentation de la méthode */ public String sayHello () throws RemoteException { return message ; } }
  • 26. Etapes de développement : Exemple Programme du serveur: HelloServer.java classe principale pour lancer notre serveur RMI en tant qu’application 26 import java.rmi.*; import java.rmi.registry.LocateRegistry; public class HelloServer { public static void main (String [ ] argv) { try { /*Lance un registry localement sur le port d'écoute passé en paramètre : 1099*/ LocateRegistry.createRegistry(1099); /* créer une instance de la classe Hello et l’enregistrer dans le serveur de noms */ HelloImpl od=new HelloImpl ("Hello word !"); Naming.rebind ("rmi//localhost:1099/HelloWord”, od) ; System.out.println ("Serveur prêt.") ; } catch (Exception e) { System.out.println ("Erreur serveur : " + e) ; } } }
  • 27. Etapes de développement : Exemple Programme du client : HelloClient.java 27 import java.rmi.*; public class HelloClient { public static void main (String [ ] argv) { try { /* trouver une référence vers l’objet distant */ HelloImpl hello = (HelloImpl) Naming.lookup("rmi//localhost:1099/HelloWord"); /* appel de méthode à distance */ System.out.println (hello.sayHello()) ; } catch (Exception e) { System.out.println ("Erreur client : " + e) ; } } }
  • 28. Etapes de développement : Exemple Pour tester l’application : o Sur la machine serveur :  Compiler les interfaces et les programmes du serveur : javac HelloInterface.java HelloImpl.java HelloServer.java  Créer les talons client Hello_Stub.java (Stub ) et serveur Hello_Skel.java (squelette) pour les objets appelés à distance (à partir de leurs interfaces) - ici une seule classe, HelloImpl rmic -keep HelloImpl  Lancer le serveur : java HelloServer o Sur la machine client :  compiler les interfaces et le programme client javac HelloInterface.java HelloClient.java  Lancer le client : java HelloClient 28
  • 29. Conclusion o Avantages:  Plus simple que le développement des sockets JAVA  Supporte la POO  Transparence dans les communications entre objets  Gestion distribuée des ressources o Inconvénients:  Limité à la plate-forme JAVA  Architecture fortement couplée (architectures à mémoire commune) 29

×