Des sockets à RMI.

Slides:



Advertisements
Présentations similaires
Mais vous comprenez qu’il s’agit d’une « tromperie ».
Advertisements

La programmation orientée objet avec Java L3-MIAGE Plan
1 Plus loin dans lutilisation de Windows Vista ©Yves Roger Cornil - 2 août
Invocation de Méthode à des Objets distants RMI et Corba
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
Objets Distribués et Composants
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é
Programmation Réseaux Illustration : Les Sockets en Java Anne-Marie Déry À travailler seuls Concepts généraux Mise en œuvre Java.
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.
Des sockets à RMI Programmation réseau versus programmation objet
Objets Distribués Chronique dune invasion annoncée Pourquoi? Comment? Qui : Corba / COM-DCOM / Java RMI...
ESSI AM Dery Merci à Rémi Vankeisbelck, Michel Riveill etc
ESSI AM Dery Merci à Rémi Vankeisbelck, Michel Riveill etc
Objets Distribués Chronique d ’une invasion annoncée
Des sockets à RMI. Pourquoi ? Maturation de la technologie orientée objet –ADA, Modula –Smalltalk, C++, Java Maturation des communications Client- Serveur.
À travailler seuls Département SI AM Dery Concepts généraux
À travailler seuls Département SI AM Dery Concepts généraux
Des sockets à RMI. Pourquoi ? Maturation de la technologie orientée objet –ADA, Modula –Smalltalk, C++, Java Maturation des communications Client- Serveur.
Introduction aux applications réparties
Exposé de Système - Informatique et Réseau
Plan du cours La sérialisation: – comment stocker et restaurer les Objets? Les interfaces graphiques et la programmation évènementielle. –Comment concevoir.
51 Les technologies XML Cours 6 : XML et les architectures N-tiers – Tier Métier Janvier Version 1.0 -
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
LES TRIANGLES 1. Définitions 2. Constructions 3. Propriétés.
TD 1 IJA Introduction Objet, méthode, attribut Classe, instance


Servlet JAVA.
Etude des Technologies du Web services
XML-Family Web Services Description Language W.S.D.L.
Module 1 : Préparation de l'administration d'un serveur
JavaBeans Réalise par: EL KHADRAOUY TARIK AOUTIL SAFOWAN.
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.
Concepts de base : la Classe Pour faire une comparaison simple, une classe serait a priori, une structure C avec des variables et des fonctions.
Java Remote Method Invocation (RMI)
Laboratoire d'Informatique de l’Université de Franche-Comté
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
.Net Remoting.
Objets Distribués Chronique d’une invasion annoncée Pourquoi? Comment?
Cours 12 Contenu du cours : RMI : a quoi ca sert Comment ca marche
IFT 6800 Atelier en Technologies d’information
Chapitre 9 Les sous-programmes.
Java et les appels de méthodes distantes
MAGIE Réalisé par Mons. RITTER J-P Le 24 octobre 2004.
Leçon 1 : notion dobjet IUP Génie Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
MAGIE Réalisé par Mons. RITTER J-P Le 24 octobre 2004.
1 Architecture orientée service SOA Architecture orientée service SOA (Service Oriented Architecture)
PHP 5° PARTIE : LES COOKIES
11/04/ L'héritage Cours 7 Cours 7.
Créer des packages.
Systèmes distribués Plusieurs technologies existent : Les sockets
CEG3585/CEG3555 Tutorat 2 Hi ver 2013.
Tutorat en bio-informatique
5ième Classe (Mercredi, 19 octobre) Prog CSI2572.
Les sockets.
Module 3 : Création d'un domaine Windows 2000
Les RPC remote procedure call
 Formulaires HTML : traiter les entrées utilisateur
Master 1 SIGLIS Intégration des données dans l’entreprise Stéphane Tallard JDBC: Java Database Connectivity Master 1 SIGLIS1JDBC.
Cours MIAGE « Architectures Orientées Services »Henry Boccon-GibodCours MIAGE « Architectures Orientées Services »Henry Boccon-Gibod 1 Architectures Orientées.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Architecture Client/Serveur
Java Remote Method Invocation
Transcription de la présentation:

Des sockets à RMI

Pourquoi ? Maturation de la technologie orientée objet ADA, Modula Smalltalk , C++, Java Maturation des communications Client-Serveur sockets RPC couches OSI

L’héritage de la programmation Client Serveur Importance du marshalling Des serveurs accessibles simultanément par plusieurs clients Enregistrement des serveurs dans des annuaires de noms Communication connectée ou par message….. Appel de procédures à distance

Circulation de messages et machines hétérogènes Infrastructure informatique de distribution Couche de transport TCP UDP Couche de services Annuaires Sécurité Protocole d’applications

Exemple CLIENT EPUNSAfun SERVEUR de Surnoms oter infrastructure Protocole d’application ?

Communication client serveur Connexion au serveur Attente de requêtes Préparation de la requête Envoi de la requête Attente du résultat …. Analyse du résultat reçu Analyse de la requête ….. Exécution …. Préparation de la réponse Envoi de la réponse

Exemple : annuaire des surnoms 1:Paul:bug ou ENR/nPaul/n/bug/n ou Objet Requête Seriablizable EssiFun SERVEUR de Surnoms enregistrer(« paul »,  «bug ») unmarshalling marshalling 0111000101000.. enregistrer(« paul »,  «bug ») = TRUE unmarshalling marshalling 101.. TRUE Différence entre un transport TCP et UDP pour le codage des données ?

L’héritage de la programmation par objets Communication par envoi de messages Encapsulation et Interface Héritage et Composition

Objets = briques logicielles Assembler des briques élémentaires Réduire la complexité des systèmes d’information Séparation entre interface et implémentation Représentation et types de données Mécanismes d’abstraction

Séparation entre interface et implémentation séparation de la définition et de l’implémentation : encapsulation interface : partie visible de l’objet implémentation : partie privée inaccessible depuis d’autres objets interface = contrat entre l’objet et le monde extérieur

Séparation entre interface et implémentation Assemblage des objets dépend uniquement des interfaces, le changement local d’un objet ne perturbe pas l’ensemble de l’application. Importance de la nomenclature des objets substitution logique liée à la substitution physique

Représentation et Types de données Définition de nouveaux types Choix d’un type pour une donnée (ex. montant) devient une contrainte sur la conception. Types de données Abstraits considérés comme des types de base

Mécanismes d’abstraction Abstraction des données : essence du procédé de construction de systèmes d ’information à base d ’objets distribués par Héritage et/ou Composition Des mises en œuvre différentes selon les cas

Que peut on automatiser ? A partir du protocole d’applications Au minimum, la phase de marshalling/unmarshalling (hétérogéneité des langages, des systèmes, etc) Selon les cas, le squelette du serveur les appels distants du client

Interaction Client/server : socket TCP Serveur Client wait for incoming connection request connectionSocket = welcomeSocket.accept() create socket, port=x, for incoming request: welcomeSocket = ServerSocket() connect to hostid, port=x clientSocket = Socket() close connectionSocket read reply from clientSocket send request using read request from write reply to TCP connection setup

Client/server socket interaction: UDP create socket, clientSocket = DatagramSocket() Create, address (hostid, port=x, send datagram request using clientSocket Serveur Client create socket, port=x, for incoming request: serverSocket = DatagramSocket() read request from serverSocket close clientSocket read reply from clientSocket write reply to serverSocket specifying client host address, port umber

Exemple : annuaire des surnoms boolean enregistrer(Personne p, Surnom sn) ListOfPersonne lister() boolean oter(Surnom surnom) listePersonnes Enregistrer(AnneMarie,AM) lister() Serveur Client

Exemple : annuaire des surnoms interface : partie visible de l’objet (enregistrer, oter, lister, …) = méthodes publiques Java implémentation : partie privée inaccessible depuis d’autres objets (listePersonnes : un vecteur de Personne ou un tableau ou ….) Interface distante = contrat entre l’objet et le monde extérieur (save impossible par exemple)

Circulation de messages et machines hétérogènes Infrastructure informatique de distribution Couche de transport Responsable de l’administration des objets et de l’acheminement des messages Couche de services Objets de l’application qui résultent de la conception du modèle

Infrastructure ? CLIENT SERVEUR Service (marshalling..) transaction sécurité nommage Service (marshalling..) Transport TCP IP...

Objets distribués Un programme (objet) peut être à la fois client de certains serveurs et serveur d’autres clients Il peut y avoir reconfiguration dynamique des rôles Client Serveur

Infrastructure Objets Distribués Client Client Serveur Serveur

Générateurs Stubs Skeletons Proxy Spécifications des données Protocole d’application Int. Java IDL Générateurs RMIC / Orbix... Stubs Skeletons Proxy (sérialisation et désérialisation…) Fichiers générés

RMI public interface Surnoms extends java.rmi.Remote { public Boolean enregistrer(String nom, String surnom) throws java.rmi.RemoteException, ServeurSurnoms.surnoms.ExisteDeja ; …. }

RMI Classes et Interfaces Remote Machine locale Machine distante InterfaceDistante InterfaceDistante Souche Squelette Appel méthode m() Appel méthode m() ClasseLocale ClasseDistante

Comment activer des objets distribués ? Messages échangés entre objets = Requêtes ou Résultats Certains envois de messages n’attendent pas de résultats Requête = Destinataire + nom de méthode + Paramètres Résultat = Donnée ou indication d’une erreur ou d’une défaillance

Comment activer des objets distribués ? Mécanisme d’exécution ou de transport définit comment les messages sont véhiculés de l’objet client vers l’objet serveur (destinataire) retrouver et activer les objets adéquats Un objet client a deux manières d’envoyer des messages invocation statique invocation dynamique

Invocation statique Le nom de l’objet destinataire et le message sont connus au moment du développement Ne permet ni l’ajout ni le retrait d’objets dans les serveurs

Invocation dynamique Permet au programme client de découvrir les objets à l’exécution et les interfaces proposés par ces objets construire dynamiquement messages et requêtes envoyer et recevoir le résultat de telles requêtes Rend les systèmes réactifs et faciles à modifier

Invocation dynamique + surcharge flexibilité du code briques logicielles avec les mêmes messages pour des objets de différentes natures définir de nouveaux objets sans modifier l’interface changements qui n’affectent pas les clients

Rôle du client Invoquer les services dont il a besoin par envoi de requêtes Accès à l’objet destinataire par une référence à son implémentation par l’interface ID Unités autonomes - solidité - robustesse - adaptation

Rôle de l’infrastructure administre les implémentations, la création et la destruction d’objets réceptionne les requêtes, localise le serveur, vérifie son état et celui du destinataire active au besoin le serveur, lui envoie les données de la requête ramène les résultats au client doit être informée de l’arrêt d’un serveur doit gérer la persistance

Rôle du serveur Administrer un flot de requêtes pour un ou plusieurs objets dont il a la responsabilité Ordonnancer la séquence des opérations de réponses à une requête

Rôle du serveur d’objets active si besoin l’objet destinataire recherche et exécute la méthode passe le résultat à l’infrastructure plusieurs requêtes peuvent arriver simultanément arrêt du serveur : désactiver tous les objets et enregistrer leur état

Enregistrer un objet Opération pour publier un Objet en général, opération réalisée par le serveur Scénario Type 1. Créer un objet 2. Construire un chemin d ’accès (Name) 3. Appeler l ’opération « bind » ou « rebind » avec le chemin et la référence de l ’objet void bind (in Name n, in Object obj) raises (NotFound, CannotProceed, InvalidName, AlreadyBound);

Retrouver un objet Opération réalisée par un client ou un serveur Scénario type : construire un chemin d ’accès (Name) appeler l ’opération « resolve » avec le chemin convertir la référence obtenue dans le bon type Object resolve (in Name n) raises (NotFound, CannotProceed, InvalidName)

Invocation de Méthode à distance Exemple : Java Remote Method Invocation À travailler seuls Département SI AM Dery Concepts généraux Il faudrait ajouter quelque chose tôt sur le marshalling et quelque chose sur le protocole d ’application…. Et le déploiement Mise en œuvre Java Merci à Rémi Vankeisbelck, Michel Riveill etc

Client Serveur

Objets distribués Comment trouver une solution ? Programmation OO = envoi de requêtes entre plusieurs objets Ne peut-on pas placer des objets sur différents ordinateurs de sorte qu’ils puissent s ’envoyer directement des messages ?

Objets distribués Un programme (objet) peut être à la fois client de certains serveurs et serveur d’autres clients Il peut y avoir reconfiguration dynamique des rôles Client Serveur

Invocation de méthodes distantes Mécanisme qui permet à des objets localisés sur des machines distantes de s’échanger des messages (invoquer des méthodes)

Invocation de méthodes distantes Semble simple en théorie... ... un peu plus complexe en réalité !!!

RMI Heureusement, on utilise Java ;-) Java Remote Method Invocation est la solution à notre problème RMI permet à des objets Java d ’invoquer des méthodes sur des objets localisés dans des JVM différentes, et même distantes sur le réseau, et ceci de façon quasi transparente !!!

RMI Core API (intégré au JDK 1.1) Développé par JavaSoft Gratuit 100 % Java Développé par JavaSoft Réservé aux objets Java Utilise les sockets et le protocole JRMP

Invocation de méthodes distantes

Stubs et encodage des paramètres le code d’un objet client invoque une méthode sur un objet distant Utilisation d’un objet substitut dans la JVM du client : le stub (souche) de l ’objet serveur

Stubs et encodage des paramètres

Du côté du client Appel d’une méthode du stub (de façon entièrement transparente) le stub construit un bloc de données avec identificateur de l’objet distant à utiliser description de la méthode à appeler paramètres encodés qui doivent être passés puis il envoie ce bloc de données au serveur...

Du côté du serveur un objet de réception (Squeleton) effectue les actions suivantes : décode les paramètres encodés situe l ’objet à appeler invoque la méthode spécifiée capture et encode la valeur de retour ou l ’exception renvoyée par l ’appel

Encodage des paramètres Encodage dans un bloc d ’octets afin d ’avoir une représentation indépendante de la machine Types primitifs et «basiques» (int/Integer...) Encodés en respectant des règles établies Big Endian pour les entiers... Objets ...

Générateur de stubs Les stubs gèrent la communication ainsi que l'encodage des paramètres Processus évidemment complexe... Entièrement automatique Un outil permet de générer les stubs pour les OD

Stubs et rmic La commande rmic du jdk rend transparent la gestion du réseau pour le programmeur une référence sur un ODréférence son stub local syntaxe = un appel local objetDistant.methode()

Un exemple : le sempiternel « Hello World » !!!

Interfaces et classes prédéfinies

Interface = protocole d ’application L ’interface HelloWorld import java.rmi.*; interface HelloWorld extends Remote { public String sayHello() throws RemoteException; }

Rôle de l ’interface HelloWorld HelloWorld

Les exceptions L ’exception RemoteException doit être déclarée par toutes les méthodes distantes Appels de méthodes distants moins fiables que les appels locaux Serveur ou connexion peut être indisponible Panne de réseau ...

Du côté client HelloWorld hello = ...; // Nous verrons par la suite comment obtenir // une première référence sur un stub String result = hello.sayHello(); System.out.println(result);

Du côté Serveur Implémentation de la classe qui gère les méthodes de l ’interface HelloWorld // Classe d'implémentation du Serveur public class HelloWorldImpl extends UnicastRemoteObject implements HelloWorld { public String sayHello() throws RemoteException { String result = « hello world !!! »; System.out.println(« Méthode sayHello invoquée... » + result); return result; }

Classe d ’implémentation doit implanter l ’interface HelloWorld doit étendre la classe RemoteServer du paquetage java.rmi RemoteServer est une classe abstraite UnicastRemoteObject est une classe concrète qui gére la communication et les stubs

Classe d ’implémentation HelloWorld HelloWorld HelloWorldImpl

L ’outil RMIC outil livré avec le JDK permet de générer les stubs > rmic -v1.2 HelloWorldImpl génère un fichier HelloWorldImpl_stub.class rmic doit être passé pour toutes les classes d'implémentation des OD afin d'en générer les stubs

Référence sur un objet On sait implanter un serveur d ’un côté, et appeler ses méthodes de l ’autre MAIS Comment obtient-on une référence vers un stub de notre objet serveur ???

Localisation des objets de serveur On pourrait appeler une méthode sur un autre objet serveur qui renvoie une référence sur le stub... Mais quoi qu ’il en soit, le premier objet doit lui aussi être localisé (La poule et l ’œuf) !!! On a alors recours a un Service de Nommage

Les Services de Nommage Obtention d'une première référence sur un objet distant : « bootstrap » à l’aide d’un Service de Nommage ou Annuaire Enregistrement des références d'objets dans l'annuaire afin que des programmes distants puissent les récupérer

Exemple : Le RMIRegistry Implémentation d'un service de nommage Fourni en standard avec RMI Permet d'enregistrer des références sur des objets de serveur afin que des clients les récupèrent On associe la référence de l'objet à une clé unique (chaîne de caractères) Le client effectue une recherche par la clé, et le service de nommage lui renvoie la référence distante (le stub) de l'objet enregistré pour cette clé

Le RMIRegistry Programme exécutable fourni pour toutes les plates formes S'exécute sur un port (1099 par défaut) sur la machine serveur Pour des raisons de sécurité, seuls les objets résidant sur la même machine sont autorisés à lier/délier des références Un service de nommage est lui-même localisé à l'aide d'une URL

La classe Naming du package java.rmi permet de manipuler le RMIRegistry supporte des méthodes statiques permettant de Lier des références d'objets serveur Naming.bind(...) et Naming.rebind(...) Délier des références d'objets serveur Naming.unbind(...) Lister le contenu du Naming Naming.list(...) Obtenir une référence vers un objet distant Naming.lookup(...)

Enregistrement d ’une référence L ’objet serveur HelloWorld (coté serveur bien entendu…) On a créé l'objet serveur et on a une variable qui le référence HelloWorld hello = new HelloWorldImpl(); On va enregistrer l'objet dans le RMIRegistry Naming.rebind("HelloWorld",hello); L'objet est désormais accessible par les clients

Obtention d'une référence coté client sur l'objet serveur HelloWorld On déclare une variable de type HelloWorld et on effectue une recherche dans l'annuaire HelloWorld hello = (HelloWorld)Naming.lookup("rmi://www.helloworldserver.com/HelloWorld"); On indique quelle est l'adresse de la machine sur laquelle s'exécute le RMIRegistry ainsi que la clé La valeur retournée doit être transtypée (castée) vers son type réel

Remarque Le Service de Nommage n'a pas pour fonction le référencement de tous les objets de serveur Il devient vite complexe de gérer l'unicité des clés La règle de bonne utilisation du Naming est de lier des objets qui font office de point d'entrée, et qui permettent de manipuler les autres objets serveurs

Conception, implémentation et exécution de l'exemple Rappel On veut invoquer la méthode sayHello() d'un objet de serveur distant de type HelloWorld depuis un programme Java client Nous allons devoir coder L'objet distant Le serveur Le client Et définir les permissions de sécurité et autres emplacements de classes...

Processus de développement 1) définir une interface Java pour un OD 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 (rmic) 5) démarrer rmiregistry et lancer l’application serveur RMI 6) créer, compiler et lancer un programme client accédant à des OD du serveur

Hello World : L'objet distant Une interface et une classe d'implémentation stubs générés automatiquement par rmic toutes les classes nécessaires à l ’ objet de client doivent être déployées sur la machine cliente et accessibles au chargeur de classes (dans le CLASSPATH) L'interface HelloWorld (HelloWorld.class) Le stub HelloWorldImpl_stub généré par rmic pour cet objet

Hello World : Le serveur instancie un objet de type HelloWorld et attache au service de nommage puis objet mis en attente des invocations jusqu'à ce que le serveur soit arrêté import java.rmi.*; import java.rmi.server.*; public class HelloWorldServer { public static void main(String[] args) { try { System.out.println("Création de l'objet serveur..."); HelloWorld hello = new HelloWorldImpl(); System.out.println("Référencement dans le RMIRegistry..."); Naming.rebind("HelloWorld",hello); System.out.println("Attente d'invocations - CTRL-C pour stopper"); } catch(Exception e) { e.printStackTrace(); }

Serveur (suite) Apres avoir compilé le tout... Pour démarrer le serveur, il faut tout d'abord lancer le RMIRegistry Attention : La base de registres RMI doit connaître les interfaces et les stubs des objets qu'elle enregistre (CLASSPATH) !!! > rmiregistry & et ensuite on lance le serveur > java HelloWorldServer Création de l'objet serveur... Référencement dans le RMIRegistry... Attente d'invocations - CTRL-C pour stopper

Hello World : client obtenir une référence sur l'objet de serveur HelloWorld, invoquer la méthode sayHello(), puis afficher le résultat de l'invocation sur la sortie standard import java.rmi.*; public class HelloWorldClient { public static void main(String[] args) { try { System.out.println("Recherche de l'objet serveur..."); HelloWorld hello = (HelloWorld)Naming.lookup("rmi://server/HelloWorld"); System.out.println("Invocation de la méthode sayHello..."); String result = hello.sayHello(); System.out.println("Affichage du résultat :"); System.out.println(result); System.exit(0); } catch(Exception e) { e.printStackTrace(); }

Le client (suite) Il suffit ensuite de lancer le programme > java HelloWorldClient Recherche de l'objet serveur... Invocation de la méthode sayHello... Affichage du résultat : hello world !!! Au niveau du serveur, le message... Méthode sayHello invoquée... hello world !!! ...s'affichera dans la console

Que doit connaître le client ? Lorsqu ’un objet serveur est passé à un programme, soit comme paramètre soit comme valeur de retour, ce programme doit être capable de travailler avec le stub associé Le programme client doit connaître la classe du stub

Que doit connaître le client ? les classes des paramètres, des valeurs de retour et des exceptions doivent aussi être connues... Une méthode distante est déclarée avec un type de valeur de retour... ...mais il se peut que l ’objet réellement renvoyé soit une sous-classe du type déclaré

Que doit connaître le client ? Le client doit disposer des classes de stub, classes des objets retournés… copier les classes sur le système de fichiers local du client (CLASSPATH)... ...cependant, si le serveur est mis à jour et que de nouvelles classes apparaissent, il devient vite pénible de mettre à jour le client C ’est pourquoi les clients RMI peuvent charger automatiquement des classes de stub depuis un autre emplacement Il s ’agit du même type de mécanisme pour les applets qui fonctionnent dans un navigateur

Chargement dynamique des classes Problème de sécurité Le programme client télécharge du code sur le réseau Ce code pourrait contenir des virus ou effectuer des opérations non attendues !!! Utilisation d ’un gestionnaire de sécurité pour les applications de clients RMI Possibilité de créer des gestionnaires de sécurité personnalisés pour des applications spécifiques RMI fournit des gestionnaires de sécurité suffisants pour un usage classique

Chargement dynamique Pour ne plus déployer les classes du serveur chez le client Utilisation des chargeurs de classes qui téléchargent des classes depuis une URL Utilisation d ’un serveur Web qui fournit les classes Ce que ça change Bien entendu, les classes et interfaces de l ’ objet distant ne changent pas Le code du serveur ne change pas le client et la façon de le démarrer sont modifiés Et lancer un serveur Web pour nos classes

Hello World : chargement dynamique Séparation des classes Serveur (fichiers nécessaires a l'exécution du serveur) HelloWorldServer.class HelloWorldImpl.class HelloWorld.class HelloWorldImpl_Stub.class Download (fichiers de classes à charger dans le programme client) Client (fichiers nécessaires au démarrage du client) HelloWorldClient.class

Hello World : Démarrage du serveur Web Mettre les classes Download dans le répertoire des documents Web du serveur Web, accessibles via une URL le chargeur de classes ira chercher les classes à un emplacement de type http://www.class-server.com/classes/HelloWorldImpl_Stub.class };

Hello World : Politiques de sécurité Le programme Java client doit pouvoir se connecter aux ports de la base de registres RMI et des implémentations des objets de serveur, ainsi qu'au port du serveur Web Fichier client.policy grant { permission java.net.SocketPermission "*:1024-65535", "connect,resolve"; "*:80", "connect"; };

Hello World : gestionnaire de sécurité RMI Le client intègre un gestionnaire de sécurité RMI pour les stubs téléchargés dynamiquement import java.rmi.*; import java.rmi.server.*; public class HelloWorldClient { public static void main(String[] args) { try { // Installe un gestionnaire de sécurité RMI System.setSecurityManager(new RMISecurityManager()); System.out.println("Recherche de l'objet serveur..."); HelloWorld hello = (HelloWorld)Naming.lookup("rmi://server/HelloWorld"); System.out.println("Invocation de la méthode sayHello..."); String result = hello.sayHello(); System.out.println("Affichage du résultat :"); System.out.println(result); } catch(Exception e) { e.printStackTrace(); }

Hello World : Démarrage coté serveur 1) Lancer la base de registres RMI (elle doit pouvoir accéder aux classes Download - CLASSPATH) > rmiregistry 2) Lancer le serveur Web servant les fichiers de classes Download 3) Lancer le serveur (les classes Server doivent être accessibles) > java HelloWorldServer Création de l'objet serveur... Référencement dans le RMIRegistry... Attente d'invocations - CTRL-C pour stopper

Hello World : Démarrage coté client Le client doit pouvoir se connecter à des machines distantes pour la base de registres RMI, les objets de serveur ainsi que le serveur Web On doit lui fournir un fichier client.policy Le client doit bien connaître l'emplacement des classes afin de pouvoir les télécharger On va le lui préciser lors du lancement > java -Djava.security.policy=client.policy -Djava.rmi.server.codebase=http://www.class-server.com:80/ HelloWorldClient

Passage de paramètres On sera souvent amenés a passer des paramètres aux méthodes distantes... Les méthodes distantes peuvent retourner une valeur ou lever une exception... On a deux types de paramètres Les objets locaux Les objets distants

Passage de paramètres: ATTENTION Certains objets sont copiés (les objets locaux), d'autres non (les objets distants) Les objets distants, non copiés, résident sur le serveur Les objets locaux passés en paramètre doivent être sérialisables afin d'être copiés, et ils doivent être indépendants de la plate-forme Les objets qui ne sont pas sérialisables lèveront des exceptions Attention aux objets sérialisables qui utilisent des ressources locales !!!

Conclusion On a vu ce qu'est une invocation de méthode distante On a vu le mécanisme des stubs, ainsi que l'encodage des paramètres On a vu le déploiement avec téléchargement des classes dynamiquement Nous avons même appliqué ces concepts au travers de l'exemple "HelloWorld » en RMI

Erreurs classiques rmiregistry pas lancé Stub inaccessible au rmiregistry java.rmi.ServerException: RemoteException occurred in server ... java.rmi.UnmarshalException: error unmarshalling ... java.lang.ClassNotFoundException: Le stub est accessible au serveur MAIS PAS AU rmiregistry Attention à l’ordre d’appel : génération des stubs et appel du rmiregistry rmiregistry pas lancé   java.net.ConnectException Oubli du constructeur pour le RemoteObject unreported exception java.rmi.RemoteException in default constructorpublic class HelloImpl extends UnicastRemoteObject implements Hello {       ^ rmiregistry déjà lancé java.rmi.server.ExportException: Port already in use: 1099On peut lancer un autre registry mais sur un autre port.

Erreurs classiques La classe d’implémentation n'hérite pas de UnicastRemoteObject S'il n'hérite pas de UnicastRemoteObject, il n'est pas Remote donc on ludemande d'être Serializable ... Trouble: java.rmi.MarshalException: error marshalling arguments; nested exception is:         java.io.NotSerializableException: CalculatorImpl ATTENTION aux CLASSPATH et package Java

Une autre utilisation du rmiRegistry import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; Client Registry registry; registry = LocateRegistry.getRegistry(); Hello hello = (Hello) registry.lookup("coucou"); Serveur LocateRegistry.createRegistry(port); // port=1099 Hello stub = (Hello) UnicastRemoteObject.exportObject(unHello, 0); Naming.rebind("rmi://"+"localhost"+":"+ port +"/coucou", stub);