Java et les appels de méthodes distantes

Slides:



Advertisements
Présentations similaires
ORTHOGRAM PM 3 ou 4 Ecrire: « a » ou « à » Référentiel page 6
Advertisements

Distance inter-locuteur
Spécialisation/généralisation Héritage Polymorphisme
Invocation de Méthode à des Objets distants RMI et Corba
Plan de l’enseignement
ESSI AM Dery Merci à Rémi Vankeisbelck, Michel Riveill etc
Harmonisation AM Dery Merci à Rémi Vankeisbelck, Michel Riveill etc
Retour sur RMI.
1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté
Java et la réflexivité.
Java et la réflexivité. Java reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and.
ESSI AM Dery Merci à Rémi Vankeisbelck, Michel Riveill etc
ESSI AM Dery Merci à Rémi Vankeisbelck, Michel Riveill etc
Des sockets à RMI. Pourquoi ? Maturation de la technologie orientée objet –ADA, Modula –Smalltalk, C++, Java Maturation des communications Client- Serveur.
Des sockets à RMI.
Les numéros
Introduction aux applications réparties
Cours MIAGE « Architectures Orientées Services » Henry Boccon-Gibod 1 Architectures Orientées Services Composants de Service Exemple pratique de développement.
Exposé de Système - Informatique et Réseau
(Classes prédéfinies – API Java)
Cours n°2M2. IST-IE (S. Sidhom) UE 303 Promo. M2 IST-IE 2005/06 Conception dun système d'information multimédia Architecture trois-tiers : PHP/MySQL &
Architecture de réseaux
Cours 6 : XML et les architectures N-tiers – Tier Applicatif
Programmation Objet en JAVA Cours 9 : Réseau R. M
LICENCE MIAGE Introduction Programmation Orientée Objet JAVA philippe
TD 1 IJA Introduction Objet, méthode, attribut Classe, instance

TP 3-4 BD21.
User management pour les entreprises et les organisations Auteur / section: Gestion des accès.
Mr: Lamloum Med LES NOMBRES PREMIERS ET COMPOSÉS Mr: Lamloum Med.
Principes de programmation (suite)
Etude des Technologies du Web services
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
1 Sécurité Informatique : Proxy Présenter par : Mounir GRARI.
Serveurs Partagés Oracle
Java Remote Method Invocation (RMI)
1 Guide de lenseignant-concepteur Vincent Riff 27 mai 2003.
Virtual Local Area Network
Titre : Implémentation des éléments finis sous Matlab
Configuration de Windows Server 2008 Active Directory
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
.Net Remoting.
Les relations clients - serveurs
Projet poker 1/56. Introduction Présentation de léquipe Cadre du projet Enjeux Choix du sujet 2.
F Copyright © Oracle Corporation, Tous droits réservés. Créer des programmes avec Procedure Builder.
LES NOMBRES PREMIERS ET COMPOSÉS
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
Cours 12 Contenu du cours : RMI : a quoi ca sert Comment ca marche
Programmation concurrente
IFT 6800 Atelier en Technologies d’information
COURS DE PROGRAMMATION ORIENTEE OBJET :
Proxy et plus Cnam Paris jean-michel Douin, douin au cnam point fr
1111 Gestion des exceptions Objectifs À la fin de ce cours, vous serez capables de : • Expliquer les concepts de base de la gestion des exceptions.
Vue d'ensemble Configuration d'adresses IP
1/65 微距摄影 美丽的微距摄影 Encore une belle leçon de Macrophotographies venant du Soleil Levant Louis.
11/04/ L'héritage Cours 7 Cours 7.
Systèmes distribués Plusieurs technologies existent : Les sockets
CEG3585/CEG3555 Tutorat 2 Hi ver 2013.
Tutorat en bio-informatique
Auvray Vincent Blanchy François Bonmariage Nicolas Mélon Laurent
Les sockets.
FTP : File Transfer Protocol (protocole de transfert de fichier ) est un protocole de communication destiné à l'échange informatique de fichiers sur.
Les RPC remote procedure call
Master 1 SIGLIS Intégration des données dans l’entreprise Stéphane Tallard JDBC: Java Database Connectivity Master 1 SIGLIS1JDBC.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Java RMI: Remote Method Invocation
Architecture Client/Serveur
Remote Method Invocation
Java Remote Method Invocation
Transcription de la présentation:

Java et les appels de méthodes distantes Objets Distribués Java et les appels de méthodes distantes Remote Method Invocation (RMI) Samia Saad-Bouzefrane Maître de Conférences en Informatique Laboratoire CEDRIC CNAM

Références bibliographiques Java & Internet de Gilles Roussel et Etienne Duris, Ed Vuibert, 2000. Mastering RMI, Rickard Öberg, Ed. Willey, 2001. J2EE, Ed. Wrox, 2001. Cours RMI, D. Olivier & S. Bouzefrane, DESS SOR, université du Havre, 2001/2002 Tutorial de Java RMI de Sun : http://java.sun.com/docs/books/tutorial/rmi/index.html

Appel local : interface et objet public interface ReverseInterface { String reverseString(String chaine); } public class Reverse implements ReverseInterface { public String reverseString (String ChaineOrigine){ int longueur=ChaineOrigine.length(); StringBuffer temp=new StringBuffer(longueur); for (int i=longueur; i>0; i--) { temp.append(ChaineOrigine.substring(i-1, i));} return temp.toString();

Appel local : programme appelant l’objet import ReverseInterface; public class ReverseClient { public static void main (String [] args) { Reverse rev = new Reverse(); String result = rev.reverseString (args [0]); System.out.println ("L'inverse de "+args[0]+" est "+result); } $javac *.java $java ReverseClient Alice L’inverse de Alice est ecilA $

Qu’attend t-on d’un objet distribué ? Un objet distribué doit pouvoir être vu comme un objet « normal ». Soit la déclaration suivante : ObjetDistribue monObjetDistribue; On doit pouvoir invoquer une méthode de cet objet situé sur une autre machine de la même façon qu’un objet local : monObjetDisribue.uneMethodeDeLOD();

On doit pouvoir utiliser cet objet distribué sans connaître sa localisation. On utilise pour cela un service sorte d’annuaire, qui doit nous renvoyer son adresse. monObjetDistribue= ServiceDeNoms.recherche(‘myDistributedObject’); On doit pouvoir utiliser un objet distribué comme paramètre d’une méthode locale ou distante.  x=monObjetLocal.uneMethodeDeLOL(monObjetDistribue); x= monObjetDistribue.uneMethodeDeLOD(autreObjetDistribue);

On doit pouvoir récupérer le résultat d’un appel de méthode sous la forme d’un objet distribué. monObjetDistribue=autreObjetDistribue.uneMethodeDeLOD(); monObjetDistribue=monObjetLocal.uneMethodeDeLOL();

Remote Method Invocation Java RMI Remote Method Invocation permet la communication entre machines virtuelles Java (JVM) qui peuvent se trouver physiquement sur la même machine ou sur deux machines distinctes.

Présentation RMI est un système d’objets distribués constitué uniquement d’objets java ; RMI est une Application Programming Interface (intégrée au JDK 1.1 et plus) ; Développé par JavaSoft ;

Mécanisme qui permet l’appel de méthodes entre objets Java qui s’exécutent éventuellement sur des JVM distinctes ; L ’appel peut se faire sur la même machine ou bien sur des machines connectées sur un réseau ; Utilise les sockets ; Les échanges respectent un protocole propriétaire : Remote Method Protocol ; RMI repose sur les classes de sérialisation.

Invocation de la méthode distante Architecture Invocation de la méthode distante Stub Couche références distantes TCP/IP Interface Hard Objet distant Squelette Application Présentation Session Transport/réseau Liaison de données /Physique

Appel local versus Appel à distance Client interface Objet Appel local méthode+ arguments Client interface interface Stub Skeleton interface Objet retour + exception Appel distant Réseau

Les amorces (Stub/Skeleton) Elles assurent le rôle d’adaptateurs pour le transport des appels distants Elles réalisent les appels sur la couche réseau Elles réalisent l’assemblage et le désassemblage des paramètres (marshalling, unmarshalling) Une référence d’objets distribué correspond à une référence d’amorce Les amorces sont créées par le générateur rmic.

Les Stubs Représentants locaux de l’objet distribué ; Initient une connexion avec la JVM distante en transmettant l’invocation distante à la couche des références d’objets ; Assemblent les paramètres pour leur transfert à la JVM distante ; Attendent les résultats de l’invocation distante ; Désassemblent la valeur ou l’exception renvoyée ; Renvoient la valeur à l’appelant ; S’appuient sur la sérialisation.

Les squelettes Désassemblent les paramètres pour la méthode distante ; Font appel à la méthode demandée ; Assemblage du résultat (valeur renvoyée ou exception) à destination de l’appelant.

La couche des références d’objets Remote Reference Layer Permet d ’obtenir une référence d’objet distribué à partir de la référence locale au stub ; Cette fonction est assurée grâce à un service de noms rmiregister (qui possède une table de hachage dont les clés sont des noms et les valeurs sont des objets distants) ; Un unique rmiregister par JVM ; rmiregister s ’exécute sur chaque machine hébergeant des objets distants ; rmiregister accepte des demandes de service sur le port 1099;

La couche transport réalise les connexions réseau basées sur les flux entre les JVM emploie un protocole de communication propriétaire (JRMP: Java Remote Method Invocation) basé sur TCP/IP Le protocole JRMP a été modifié afin de supprimer la nécessité des squelettes car depuis la version 1.2 de Java, une même classe skeleton générique est partagée par tous les objets distants.

Etapes d’un appel de méthode distante Client Serveur Serveur de noms 3. Interroger 2. Publier 1. Exposer Objet distant 4. Récupérer Application Cliente Serveur d’objets 7. Appel méthode 6. Arguments sérialisation 5. Appel de méthode Stub Skeleton 8. Retour 10. Retour 9. Résultat

Développer une application avec RMI : Mise en œuvre 1. Définir une interface distante (Xyy.java) ; 2. Créer une classe implémentant cette interface (XyyImpl.java) ; 3. Compiler cette classe (javac XyyImpl.java) ; 4. Créer une application serveur (XyyServer.java) ; 5. Compiler l’application serveur ; 6. Créer les classes stub et skeleton à l’aide de rmic XyyImpl_Stub.java et XyyImpl_Skel.java (Skel n’existe pas pour les versions >1.2) ; 7. Démarrage du registre avec rmiregistry ; 8. Lancer le serveur pour la création d’objets et leur enregistrement dans rmiregistry; 9. Créer une classe cliente qui appelle des méthodes distantes de l’objet distribué (XyyClient.java) ; 10. Compiler cette classe et la lancer.

Inversion d’une chaîne de caractères à l’aide d’un objet distribué Invocation distante de la méthode reverseString() d’un objet distribué qui inverse une chaîne de caractères fournie par l’appelant. On définit : ReverseInterface.java : interface qui décrit l’objet distribué Reverse.java : qui implémente l’objet distribué ReverseServer.java : le serveur RMI ReverseClient.java : le client qui utilise l’objet distribué

Fichiers nécessaires Côté Serveur Côté Client l’interface : ReverseInterface l’objet : Reverse le serveur d’objets : ReverseServer l’interface : ReverseInterface le client : ReverseClient

Interface de l’objet distribué - Elle est partagée par le client et le serveur ; - Elle décrit les caractéristiques de l’objet ; - Elle étend l’interface Remote définie dans java.rmi. Toutes les méthodes de cette interface peuvent déclencher une exception du type RemoteException. Cette exception est levée : - si connexion refusée à l’hôte distant - ou bien si l’objet n’existe plus, - ou encore s’il y a un problème lors de l’assemblage ou le désassemblage.

Interface de la classe distante import java.rmi.Remote; import java.rmi.RemoteException; public interface ReverseInterface extends Remote { String reverseString(String chaine) throws RemoteException; }

Implémentation de l’objet distribué L’implémentation doit étendre la classe RemoteServer de java.rmi.server RemoteServer est une classe abstraite UnicastRemoteObject étend RemoteServer - c’est une classe concrète - une instance de cette classe réside sur un serveur et est disponible via le protocole TCP/IP

Implémentation de l’objet distribué import java.rmi.*; import java.rmi.server.*; public class Reverse extends UnicastRemoteObject implements ReverseInterface { public Reverse() throws RemoteException { super(); } public String reverseString (String ChaineOrigine) throws RemoteException { int longueur=ChaineOrigine.length(); StringBuffer temp=new StringBuffer(longueur); for (int i=longueur; i>0; i--) temp.append(ChaineOrigine.substring(i-1, i)); return temp.toString(); } }

Le serveur Programme à l’écoute des clients ; Enregistre l’objet distribué dans rmiregistry Naming.rebind("rmi://hote.cnam.fr:1099/Reverse", rev); On installe un gestionnaire de sécurité si le serveur est amené à charger des classes (inutile si les classes ne sont pas chargées dynamiquement) System.setSecurityManager(new RMISecurityManager());

Le serveur import java.rmi.*; import java.rmi.server.*; public class ReverseServer { public static void main(String[] args) { try { System.out.println( "Serveur : Construction de l’implémentation "); Reverse rev= new Reverse(); System.out.println("Objet Reverse lié dans le RMIregistry"); Naming.rebind("rmi://sinus.cnam.fr:1099/MyReverse", rev); System.out.println("Attente des invocations des clients …"); } catch (Exception e) { System.out.println("Erreur de liaison de l'objet Reverse"); System.out.println(e.toString()); } // fin du main } // fin de la classe

Le Client Le client obtient un stub pour accéder à l’objet par une URL RMI ReverseInterface ri = (ReverseInterface) Naming.lookup ("rmi://sinus.cnam.fr:1099/MyReverse"); Une URL RMI commence par rmi://, le nom de machine, un numéro de port optionnel et le nom de l’objet distant. rmi://hote:2110/nomObjet Par défaut, le numéro de port est 1099 défini (ou à définir) dans /etc/services : rmi 1099/tcp

Le Client Installe un gestionnaire de sécurité pour contrôler les stubs chargés dynamiquement : System.setSecurityManager(new RMISecurityManager()); Obtient une référence d’objet distribué : ReverseInterface ri = (ReverseInterface) Naming.lookup ("rmi://sinus.cnam.fr:1099/MyReverse"); Exécute une méthode de l’objet : String result = ri.reverseString ("Terre");

Le Client import java.rmi.*; import ReverseInterface; public class ReverseClient { public static void main (String [] args) { System.setSecurityManager(new RMISecurityManager()); try{ ReverseInterface rev = (ReverseInterface) Naming.lookup ("rmi://sinus.cnam.fr:1099/MyReverse"); String result = rev.reverseString (args [0]); System.out.println ("L'inverse de "+args[0]+" est "+result); } catch (Exception e) System.out.println ("Erreur d'accès à l'objet distant."); System.out.println (e.toString());

Le Client Pour que le client puisse se connecter à rmiregistry, il faut lui fournir un fichier de règles de sécurité client.policy. $more client.policy grant { permission java.net.SocketPermission  ":1024-65535",  "connect" ;  ":80",  "connect"; }; $more client1.policy permission java.security.AllPermission;

Compilation et Exécution - Compiler les sources (interface, implémentation de l’objet, le serveur et le client ) : sinus> javac *.java - Lancer rmic sur la classe d’implémentation : sinus>rmic -v1.2 Reverse sinus>transférer *Stub.class et ReverseInterface.class vers la machine cosinus - Démarrer rmiregistry : sinus>rmiregistry -J-Djava.security.policy=client1.policy&

- Lancer le serveur : - Exécuter le client : sinus>java ReverseServer & Serveur :Construction de l’implémentation Objet Reverse lié dans le RMIregistry Attente des invocations des clients … - Exécuter le client : cosinus>java -Djava.security.policy=client1.policy ReverseClient Lille L'inverse de Alice est ecilA

Charger des classes de manière dynamique - Les définitions de classe sont hébergées sur un serveur Web ; Les paramètres, les stubs sont envoyés au client via une connexion au serveur Web; - Pour fonctionner, une application doit télécharger les fichiers de classe. Chargement dynamique évite de disposer localement de toutes les définitions de classe ; les mêmes fichiers de classe (même version) sont partagés par tous les clients - charge une classe au besoin.

Fichiers nécessaires si pas de chargement dynamique Côté Serveur Côté Client l’interface : ReverseInterface le stub : Reverse_Stub le client : ReverseClient l’interface : ReverseInterface l’objet : Reverse le serveur d’objets : ReverseServer

Fichiers nécessaires si chargement dynamique Côté Serveur Côté Client le client : ReverseClient le serveur d’objets : ReverseServer Récupérer les fichiers de classe à partir du serveur Web - Interface : ReverseInterface - Stub : Reverse_Stub - l’objet : Reverse Serveur Web

Le client peut être lui même dynamique Côté Serveur Côté Client le client : DynamicClient le serveur d’objets : ReverseServer Récupérer les fichiers de classe à partir du serveur Web - Interface : ReverseInterface l’objet : Reverse - Stub : Reverse_Stub le client : ReverseClient Serveur Web

Le client peut être lui même dynamique Côté Serveur Côté Client Le client : DynamicClient Chargement dynamique du client et de l’interface à partir d’un répertoire local. Si non disponibles localement, ils sont recherchés sur le serveur Web spécifié. L’exécution de ReverseClient permet d’obtenir la référence de l’objet Reverse et l’appel distant de sa méthode. Le serveur d’objets : ReverseServer Chargement dynamique de l’objet Reverse à partir du serveur Web Enregistrement de l’objet dans RMIregistry (bind) Attente de requêtes des clients - Interface : ReverseInterface l’objet : Reverse -Stub : Reverse_Stub le client : ReverseClient Serveur Web

Deux propriétés systèmes dans RMI java.rmi.server.codebase : spécifie l ’URL (file://, ftp://, http://) où peuvent se trouver les classes. Lorsque RMI sérialise l’objet (envoyé comme paramètre ou reçu comme résultat), il rajoute l’URL spécifiée par codebase. java.rmi.server.useCodebaseOnly : informe le client que le chargement de classes est fait uniquement à partir du répertoire du codebase.

Principe du chargement dynamique A l’enregistrement (dans rmiregistry) de l ’objet distant, le codebase est spécifié par java.rmi.server.codebase. A l’appel de bind(), le registre utilise ce codebase pour trouver les fichiers de classe associés à l’objet. Le client recherche la définition de classe du stub dans son classpath. S’il ne la trouve pas, il essayera de la récupérer à partir du codebase. Une fois que toutes les définitions de classe sont disponibles, la méthode proxy du stub appelle les objets sur le serveur.

Sécurité lors d’un chargement dynamique - Les classes java.rmi.RMISecurityManager et java.rmi.server.RMIClassLoader vérifient le contexte de sécurité avant de charger des classes à partir d’emplacements distants. - La méthode LoadClass de RMIClassLoader charge la classe à partir du codebase spécifié.

Les différentes étapes d’un chargement dynamique Écrire les classes correspondant respectivement à l’interface et à l’objet. Les compiler. Générer le Stub correspondant à l’objet. Installer tous les fichiers de classe sur un serveur Web. Écrire le serveur dynamique. Installer rmiregistry au niveau de la machine du serveur. Lancer le serveur en lui précisant l’URL des fichiers de classe afin qu’il puisse charger dynamiquement le fichier de classe correspondant à l’objet, l’instancier (le créer) et l’enregistrer auprès de rmiregistry. Sur la machine du client, écrire le code du client. Compiler le client statique et l’installer éventuellement sur le site Web. Compiler le client dynamique et le lancer en précisant l’URL des fichiers de classe.

Exemple avec chargement dynamique // l’interface import java.rmi.Remote; import java.rmi.RemoteException; public interface ReverseInterface extends Remote { String reverseString(String chaine) throws RemoteException; }

L’objet Reverse : import java.rmi.*; import java.rmi.server.*; public class Reverse extends UnicastRemoteObject implements ReverseInterface { public Reverse() throws RemoteException { super(); } public String reverseString (String ChaineOrigine) throws RemoteException { int longueur=ChaineOrigine.length(); StringBuffer temp=new StringBuffer(longueur); for (int i=longueur; i>0; i--) temp.append(ChaineOrigine.substring(i-1, i)); return temp.toString(); } }

Le serveur dynamique : import java.rmi.Naming; import java.rmi.Remote; import java.rmi.RMISecurityManager; import java.rmi.server.RMIClassLoader; import java.util.Properties; public class DynamicServer { public static void main(String[] args) { System.setSecurityManager(new RMISecurityManager()); try { Properties p= System.getProperties(); String url=p.getProperty("java.rmi.server.codebase"); Class ClasseServeur = RMIClassLoader.loadClass(url, "Reverse"); Naming.rebind("rmi://sinus.cnam.fr:1099/MyReverse", (Remote)ClasseServeur.newInstance());

Suite du serveur dynamique : System.out.println("Objet Reverse lié dans le RMIregistry"); System.out.println("Attente des invocations des clients …"); } catch (Exception e) { System.out.println("Erreur de liaison de l'objet Reverse"); System.out.println(e.toString()); } // fin du main } // fin de la classe

Le client : import java.rmi.*; public class ReverseClient { public ReverseClient () { String mot="Alice"; try{ ReverseInterface rev = (ReverseInterface) Naming.lookup ("rmi://sinus.cnam.fr:1099/MyReverse"); String result = rev.reverseString(args[0]); System.out.println ("L'inverse de " + mot + " est "+result); } catch (Exception e) System.out.println ("Erreur d'accès à l'objet distant "); System.out.println (e.toString());

Le client dynamique : import java.rmi.RMISecurityManager; import java.rmi.server.RMIClassLoader; import java.util.Properties; public class DynamicClient { public DynamicClient (String [] args) throws Exception { Properties p = System.getProperties(); String url = p.getProperty("java.rmi.server.codebase"); Class ClasseClient = RMIClassLoader.loadClass(url, "ReverseClient"); // lancer le client Constructor [] C = ClasseClient.getConstructors(); C[0].newInstance(new Object[]{args}); } // vérifier le passage de paramètres

Suite du client dynamique : public static void main (String [] args) { System.setSecurityManager(new RMISecurityManager()); try{ DynamicClient cli = new DynamicClient() ; } catch (Exception e) { System.out.println (e.toString());

sinus> ls Reverse.java ReverseInterface.java DynamicServer.java sinus> javac *.java sinus> rmic -v1.2 Reverse sinus> mv Reverse*.class /var/www/html/samia/rmi Le répertoire destination des fichiers de classe doit être accessible par http. sinus> ls *.class DynamicServer.class sinus>rmiregistry -J-Djava.security.policy=client1.policy & sinus>java -Djava.security.policy=client1.policy -Djava.rmi.server.codebase= http://sinus.cnam.fr/samia/rmi DynamicServer Objet lié Attente des invocations des clients … ---------------------------------- cosinus>ls *.java ReverseClient.java DynamicClient.java cosinus>javac *.java cosinus>java -Djava.security.policy=client1.policy -Djava.rmi.server.codebase= http://sinus.cnam.fr/samia/rmi DynamicClient L’inverse de Alice est ecilA cosinus> Le chargement de ReverseClient se fera à partir du répertoire local alors que ReverseInterface et Reverse_Stub seront chargés à partir du serveur Web spécifié dans la commande.