RMI le langage Java XII-1 JMF



Documents pareils
Remote Method Invocation (RMI)

Remote Method Invocation en Java (RMI)

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Remote Method Invocation Les classes implémentant Serializable

Programmation répartie RPC & RMI

Java RMI. Arnaud Labourel Courriel: Université de Provence. 8 mars 2011

Calcul Parallèle. Cours 5 - JAVA RMI

Intergiciel - concepts de base

Java - RMI Remote Method Invocation. Java - RMI

Conception de serveurs d'applications ouverts

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Programmation réseau avec Java. 3/7 RMI, un peu de sécurité et CORBA

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

GEI 465 : Systèmes répartis

Chapitre 10. Les interfaces Comparable et Comparator 1

TP1 : Initiation à Java et Eclipse

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Premiers Pas en Programmation Objet : les Classes et les Objets

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Développement, déploiement et sécurisation d'applications JEE

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Modèle client-serveur Plan. Modèle client-serveur. Modèle client-serveur définition. Modèle client-serveur communication par messages.

Java DataBaseConnectivity

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

ACTIVITÉ DE PROGRAMMATION

Initiation à JAVA et à la programmation objet.

Programmation par les Objets en Java

La base de données XML exist. A. Belaïd

Java Licence professionnelle CISII,

Programmer en JAVA. par Tama

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Principes. 2A-SI 3 Prog. réseau et systèmes distribués 3. 3 Programmation en CORBA. Programmation en Corba. Stéphane Vialle

Création d une application JEE

INITIATION AU LANGAGE JAVA

Projet gestion d'objets dupliqués

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

2 Chapitre 1 Introduction

Java c est quoi? Java. Java. Java : Principe de fonctionnement 31/01/ Vue générale 2 - Mon premier programme 3 - Types de Programme Java

Projet de Veille Technologique

Héritage presque multiple en Java (1/2)

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

Serveur d'archivage 2007 Installation et utilisation de la BD exist

TP réseaux 4 : Installation et configuration d'un serveur Web Apache

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Manuel d implémentation des Web Services Sous Axis1 et Axis2/Tomcat/linux. Par Pr Bouabid EL OUAHIDI

Langage Java. Classe de première SI

Programmation par composants (1/3) Programmation par composants (2/3)

Cours 1: Java et les objets

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Sécurité Java 2. Première approche. Installation des exemples. Exemple d'une applet

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

RN2-Programmation Orientée Objet - JAVA CH 1 Introduction à la POO et Java

Architecture Orientée Service, JSON et API REST

Une introduction à Java

Auto-évaluation Programmation en Java

Synchro et Threads Java TM

FORMATION PcVue. Mise en œuvre de WEBVUE. Journées de formation au logiciel de supervision PcVue 8.1. Lieu : Lycée Pablo Neruda Saint Martin d hères

Dis papa, c est quoi un bus logiciel réparti?

JavaServer Pages (JSP)

as Architecture des Systèmes d Information

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

.NET remoting. Plan. Principes de.net Remoting

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

La carte à puce. Jean-Philippe Babau

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

Chapitre 2. Classes et objets

contact@nqicorp.com - Web :

TD/TP PAC - Programmation n 3

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Corrigé des exercices sur les références

Programmation Objet Java Correction

TD/TP PAC - Programmation n 3

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Le modèle client-serveur

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

Etude critique de mécanismes de sécurité pour l architecture Jini

JAVA TD0. Prise en main du langage Environnement de base JAVA 1

CORBA. (Common Request Broker Architecture)

Implementing a simple RMI Application over the Internet (using and comparing HTTP tunneling, RMI Proxy)

Traitement de données

CS REMOTE CARE - WEBDAV

Gestion distribuée (par sockets) de banque en Java

contact@nqicorp.com - Web :

Java Naming and Directory Interface

Généralités sur le Langage Java et éléments syntaxiques.

Package Java.util Classe générique

Utiliser Java sans BlueJ

Environnements de Développement

Java Licence Professionnelle CISII,

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

Plan du cours. Historique du langage Nouveautés de Java 7

Transcription:

Remote Method Invocation (RMI) XII-1

Introduction RMI est un ensemble de classes permettant de manipuler des objets sur des machines distantes (objets distants) de manière similaire aux objets sur la machine locale (objet locaux). C'est un peu du "RPC orienté objet". Un objet local demande une fonctionnalité à un objet distant. RMI apparaît avec Java 1.1 et est complètement intégré depuis Java 1.1 (mars 1997) donc est gratuit ( CORBA) C'est du CORBA allégé avec ses avantages (c'est plus simple) et ses inconvénients (tout doit être Java coté client comme coté serveur) (mais JNI!). Par contre RMI peut charger des classes à l'exécution, du serveur vers le client ou dans l'autre sens contrairement à CORBA. Ces manipulations sont "relativement" transparentes. Pour cela RMI propose : - un ramasse-miettes distribué. - la gestion des représentants locaux d'objets distants et leur activation. - la liaison avec les couches transport et l'ouverture de sockets appropriés. - la syntaxe d'invocation, d'utilisation d'un objet distant est la même qu'un objet local. XII-2

RMI en pratique fonctionne dans les applications Java 1.1 et dans appletviewer. client RMI 1 4 serveur RMI 3 2 Souche (Stub) Remote Reference Layer (RRL) couche Transport Skeleton Remote Reference Layer (RRL) couche Transport la couche souche contient des représentants locaux de références d'objets distants. Une invocation d'une fonctionnalité sur cet objet distant est traité par la couche RRL (ouverture de socket, passage des arguments, marshalling,...). Les objets distants sont repérés par des références gérées par la couche skeleton. XII-3

Programmation avec RMI Pour créer une application RMI, suivre les étapes suivantes. 1 ) définir les spécifications du service RMI sous forme d'interfaces. 2 ) Créer et compiler les implémentations de ces interfaces. 3 ) Créer les classes pour la souche et le skeleton à l'aide de la commande rmic. 4 ) Créer et compiler une application «lanceur du service RMI». 5 ) lancer le rmiregister et lancer l'application «lanceur du service RMI». 6 ) Créer et compiler un programme client qui accède à des objets distants : ce service RMI. 7 ) lancer ce client. Un exemple : calcul d âge de personnes Le client envoie un objet de classe Personne à un objet distant qui calcule son âge c est à dire retourne des objets de classe Age. On utilise donc deux classes : package business; import java.util.gregoriancalendar; import java.util.calendar; import java.io.serializable; /* * Personne implemente Serializable car devra etre envoyé par RMI */ XII-4

public class Personne implements Serializable { private String nom; private String prenom; private GregorianCalendar datenaissance; public String getnom() {return nom; public String getprenom() {return prenom; int getanneenaissance() { return datenaissance.get(calendar.year); et : public Personne (String nom, String prenom, GregorianCalendar datenaissance) { this.nom = nom; this.prenom = prenom; this.datenaissance = datenaissance; package business; import java.util.gregoriancalendar; import java.util.calendar; import java.io.serializable; /* * Age implemente Serializable car devra etre retourné par RMI */ public class Age extends GregorianCalendar implements Serializable { public int getnbannees() { return this.get(calendar.year); XII-5

1 ) définir les spécifications du service RMI à l aide d'interface. Les classes placées à distance sont spécifiées par des interfaces qui doivent - hériter de java.rmi.remote et - - dont les méthodes lèvent une java.rmi.remoteexception exception. On définit alors l interface CalculAgeRMI. package calcul; import java.rmi.*; import business.*; public interface CalculAgeRMI extends Remote { public Age calcul(personne pers) throws java.rmi.remoteexception; XII-6

2 ) Créer et compiler les implémentations de ces interfaces. Il s'agit d'écrire une classe qui implémente l interface ci dessus. C est le service (classe) fourni à distance. En général ces classes ont pour nom nominterfaceimpl. Ces classes doivent dériver de java.rmi.server.unicastremoteobject qui est la classe qui permet de définir des objets distants interrogeables en point à point. Il est prévu de construire des objets distants interrogeables en diffusion mais ce n'est pas encore implanté. De plus java.rmi.server.unicastremoteobject dérive de java.rmi.server.remoteobject qui redéfinit les méthodes equals(), hashcode(), et les adaptent aux objets distribués. package calcul; import business.*; import java.rmi.*; import java.util.*; import java.rmi.server.*; XII-7 public class CalculAgeRMIImpl extends UnicastRemoteObject implements CalculAgeRMI { public CalculAgeRMIImpl() throws java.rmi.remoteexception { public Age calcul(personne pers) throws java.rmi.remoteexception { int anneenaissance = pers.getanneenaissance(); System.out.println("annee de naissance de " + pers.getnom() + " : " + anneenaissance); // faire la soustraction entre la date courante // et la date de naissance

GregorianCalendar aujourdhui = new GregorianCalendar(); int anneecourante = aujourdhui.get(calendar.year); System.out.println("annee courante : " + anneecourante); int ageentier = anneecourante - anneenaissance; // on cree un calendrier et on le positionne // pour fabriquer l'age Age agearetouner = new Age(); agearetouner.set(ageentier + 1, 0, 0); // + 1 car la premiere annee a pour indice 0 return agearetouner; Pour compiler utiliser les commandes : javac -d classes business\*.java calcul\calculagermi*.java Ces commandes vont créer les fichiers.class et les déposer dans./classes XII-8

3 ) Créer les classes pour la souche et le skeleton (commande rmic) Il faut maintenant créer la souche et le skeleton pour accéder aux classes ci dessus. Java donne un outil rmic qui utilisent les fichiers.class. la syntaxe de rmic est rmic [options] paquetage.souspaquetage..nomdeclasse1 paquetage.souspaquetage.. nomclasse2... On a donc ici : rmic -d. calcul.calculagermiimpl à lancer dans le répertoire./classes En fait, seule la souche est créée. Le squeleton est devenu inutile en Java 1.4. XII-9

4 ) Créer et compiler une application «lanceur de serveur RMI» C'est le programme qui créé une instance de serveur RMI qui sera à l'écoute des demandes des clients. Ce programme crée un objet CalculAgeRMIImpl qui attend alors les requêtes. import java.rmi.*; import java.net.malformedurlexception; import calcul.*; public class LanceServeurRMI { public static void main(string args[]) { try { CalculAgeRMIImpl ca = new CalculAgeRMIImpl(); System.out.println("l'objet RMI est construit"); Naming.rebind(Constantes.NOM_OBJET_RMI, ca); System.out.println("l'objet RMI est inscrit au service de nommage"); catch (RemoteException exp) { System.out.println("Pb de RemoteException : " + exp); catch (MalformedURLException exp) { System.out.println("Pb de NotBoundException : " + exp); avec le fichier : public interface Constantes { public static final String NOM_OBJET_RMI = "objetrmi"; XII-10

4 ) Créer et compiler une application «lanceur de serveur RMI» (suite) Si on veut que l'application indépendante (lanceur de serveur RMI) puisse télécharger des classes distantes (du futur client RMI), il faut installer un SecurityManager spécifique. Celui-ci est donné par Java et on l'installe par : System.setSecurityManager(new RMISecurityManager()); Pour rendre l'objet calcul de l âge disponible, il faut l'enregistrer dans le "RMIregistry" (voir ci dessous). On lui donne pour cela un nom et on l'enregistre par la méthode statique Naming.rebind(Constantes.NOM_OBJET_RMI, cmi); Par la suite cet objet calculateur d âge sera accessible par les autres machines en indiquant la machine sur laquelle est exécuté ce serveur RMI et le nom associé à cet objet (cf. ci dessous). Le premier argument de Naming.rebind() doit être une String : On compile ce serveur par : javac -d classes LanceServeurRMI.java XII-11

5 ) lancer rmiregister et l'application «lanceur de serveur rmi» Il faut d'abord lancer le rmiregister puis le serveur. Sous Unix, on lance rmiregistry par : % rmiregister & Sous Win32, on lance rmiregistry par : start rmiregistry Il faut lancer rmiregistry dans un répertoire tel qu il pourra accédé à la souche lorsqu on exécutera le «lanceur de serveur RMI». En effet ce lanceur de serveur RMI demande en fait au service de nommage rmiregistry de connaître la souche (pour éventuellement la donner aux clients par http). Puis on lance le serveur : % java LanceServeurRMI Ce qui rend maintenant le serveur disponible pour de futurs clients. Les sorties du serveur sont : l'objet RMI est construit l'objet RMI est inscrit au service de nommage XII-12

6 ) Créer et compiler un programme client qui accède au serveur RMI Le programme doit être lancé par : % java ClientRMI localhost import java.rmi.*; import java.util.*; import java.net.malformedurlexception; import business.*; import calcul.*; public class ClientRMI { public static void main(string args[ ]) { if (args.length!= 1) { System.out.println("usage java ClientRMI <NomMachineDistanteRMI>"); System.exit(0); GregorianCalendar gc = new GregorianCalendar(1915, 6, 11); Personne tryphontournesol = new Personne("Tournesol", "Tryphon", gc); GregorianCalendar gc2 = new GregorianCalendar(1910, 6, 24); Personne haddock = new Personne("Haddock", "Archibald", gc2); // on recupere un objet distant CalculAgeRMI // on lui demande de faire le calcul try { CalculAgeRMI carmi = (CalculAgeRMI) Naming.lookup("rmi://" + args[0] + "/" + Constantes.NOM_OBJET_RMI); Age ag = carmi.calcul(tryphontournesol); XII-13

System.out.println("la personne " + tryphontournesol.getprenom() + " " + tryphontournesol.getnom() + " a pour age : " + ag.getnbannees()); Age ag2 = carmi.calcul(haddock); System.out.println("la personne " + haddock.getprenom() + " " + haddock.getnom() + " a pour age : " + ag2.getnbannees()); catch (RemoteException exp) { System.out.println("Pb de RemoteException : " + exp); catch (NotBoundException exp) { System.out.println("Pb de NotBoundException : " + exp); catch (MalformedURLException exp) { System.out.println("Pb de NotBoundException : " + exp); Remarques Le code ci dessus manipule les objets distants comme s'ils étaient locaux. Le client recherche le service de calcul d âge distant par Naming.lookup(url) où url est une "URL rmi" de la forme rmi://machineduserveurrmi:port/nomserve urrmi Pour tester ce programme sur une seule machine utiliser localhost comme machineduserveurrmi. Naming.lookup() retourne une référence Remote qu'il faut nécessairement convertir. 7 ) lancer ce client % java ClientRMI localhost XII-14

Notions avancées (1/2) Un des plus gros intérêt de RMI est d'utiliser la particularité des machines virtuelles Java de pouvoir télécharger des classes à l'aide du protocole http donc en utilisant des serveurs Web. Ainsi on a souvent une architecture où : - la machine qui fournit le serveur RMI fournit aussi le stub pour les clients : c'est systématiquement le cas pour des applets. - la machine qui lance l'exécution du client a rangé à un endroit connu, des classes pouvant être utile au serveur RMI qui seront chargées par la machine virtuelle du serveur par le protocole http. Le client possède alors un serveur http susceptible d envoyer ces classes au serveur RMI. On utilise pour cela la propriété java.rmi.server.codebase. Le client est lancé par : java -Djava.rmi.server.codebase= http://une_machine/ repertoireousetrouvedesclassesutilespourlese rveur/ clientrmi Le serveur est lancé par : java -Djava.rmi.server.codebase= http://une_autre_machine/repertoireousetrouv edesclassesutilespourdesclientsexemplelestub / LanceServeurRMI Remarques : 1 ) Par pitié ne pas oublier le / 2 ) Mettre l adresse IP de la machine et non pas localhost. XII-15

Notions avancées (2/2) C'est parce qu'on a installé dans les 2 programmes LanceServeurRMI et ClientRMI un RMISecurityManager, que ces classes peuvent être chargées d'une machine externe à la machine d'exécution. De plus, il faut autoriser que ces programmes accepte des des connexions et se connecte sur un serveur une machine distante. Utiliser l outil policytool pour entrer l autorisation : permission java.net.socketpermission «machinedistante», «accept,connect»; (ou une autorisation plus forte ;-) ce qui donne à machinedistante l autorisation d une connexion sur la machine locale. On peut aussi indiquer cette propriété sur la ligne de commande par : java Djava.security.policy=UnFichierDeSecurite ProgrammeRMI Rappelons, par contre, que les arguments des méthodes passés du client au serveur le sont par sérialisation. Voir le tutorial de SUN à l'url http://java.sun.com/docs/books/tutorial/rmi/ index.html XII-16

Exercice 1 ) Ne pas mettre les stubs coté client. 2 ) Lancer coté serveur, le serveur de noms RMI rmiregistry, de sorte qu il ne connaisse pas les stubs 3 ) Lancer sur la machine serveur un serveur web. 4 ) Placer les stubs dans le répertoire du serveur web accessible par l url http://la_machine/repertoireousetrouvedescla ssesutilespourdesclientsexemplelestub 5 ) Placer dans le répertoire du serveur web accessible par l url des classes qui peuvent être utiles pour le stub. Dans notre exemple ce sont, les classes Age.class et Personne.class du paquetage business et l interface CalcuAgeRMI.class du paquetage calcul. 6 ) Lancer le serveur par : java -Djava.rmi.server.codebase= http://la_machine/repertoireousetrouvedesclassesu tilespourdesclientsexemplelestub/ LanceServeurRMI Bien mettre l adresse IP de la machine et pas localhost. 7 ) Lancer le client par : java ClientRMI numipmachineserveur 8 ) Ca fonctionne!! XII-17

Bibliographie Remote Method Invocation Specification à : http://www.javasoft.com/products/jdk/1. 1/docs/guide/rmi/spec/rmiTOC.doc.html ou http://www.javasoft.com/products/jdk/1. 2/docs/guide/rmi/spec/rmiTOC.doc.html Le tutorial sur RMI : http://java.sun.com/docs/books/tutorial /rmi/index.html XII-18