DUT Informatique Module JAVA Apprentis Département Informatique 2008 / 2009. Travaux Pratiques n o 7 : RMI



Documents pareils
Remote Method Invocation (RMI)

RMI le langage Java XII-1 JMF

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

Remote Method Invocation en Java (RMI)

Programmation répartie RPC & RMI

Remote Method Invocation Les classes implémentant Serializable

Intergiciel - concepts de base

DUT Informatique Module Système S4 C Département Informatique 2009 / Travaux Pratiques n o 5 : Sockets Stream

Calcul Parallèle. Cours 5 - JAVA RMI

Java - RMI Remote Method Invocation. Java - RMI

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

CORBA. (Common Request Broker Architecture)

2 Chapitre 1 Introduction

Systèmes répartis. Fabrice Rossi Université Paris-IX Dauphine. Systèmes répartis p.1/49

L3 informatique TP n o 2 : Les applications réseau

Architecture Orientée Service, JSON et API REST

TP1. Outils Java Eléments de correction

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

Conception de serveurs d'applications ouverts

Installation et prise en main

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

GEI 465 : Systèmes répartis

Application Web et J2EE

Patrons de Conception (Design Patterns)

Traitement de données

La gestion des exceptions

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

INTERNET est un RESEAU D ORDINATEURS RELIES ENTRE EUX A L ECHELLE PLANETAIRE. Internet : interconnexion de réseaux (anglais : net = réseau)

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

Mise en œuvre des serveurs d application

Le modèle client-serveur

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

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

TP1 : Initiation à Java et Eclipse

Bases Java - Eclipse / Netbeans

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

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

Composants Logiciels. Le modèle de composant de CORBA. Plan

Systeme d'exploitation

NFP111 Systèmes et Applications Réparties

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

Compte Rendu d intégration d application

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

Solution d inventaire automatisé d un parc informatique et de télédistribution OCS INVENTORY NG. EHRHARD Eric - Gestionnaire Parc Informatique

Serveur FTP. 20 décembre. Windows Server 2008R2

Comment reproduire les résultats de l article : POP-Java : Parallélisme et distribution orienté objet

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp


Programmer en JAVA. par Tama

Solutions de gestion de la sécurité Livre blanc

EXA1415 : Annotations

Cours 1: Java et les objets

Construire des plug-ins pour SAS Management Console SAS 9.1

24/11/2011. Cours EJB/J2EE Copyright Michel Buffa. Plan du cours. EJB : les fondamentaux. Enterprise Java Bean. Enterprise Java Bean.

TD/TP 1 Introduction au SDK d Android

Intergiciels pour la répartition CORBA : Common Object Request Broker. Patrice Torguet torguet@irit.fr Université Paul Sabatier

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

Programme «Analyste Programmeur» Diplôme d état : «Développeur Informatique» Homologué au niveau III (Bac+2) (JO N 176 du 1 août 2003) (34 semaines)

Web Tier : déploiement de servlets

Module d anonymisation

Table des matières Hakim Benameurlaine 1

Formation Webase 5. Formation Webase 5. Ses secrets, de l architecture MVC à l application Web. Adrien Grand <jpountz@via.ecp.fr> Centrale Réseaux

Java Naming and Directory Interface

Vulgarisation Java EE Java EE, c est quoi?

Services Réseaux - Couche Application. TODARO Cédric

Présentation. Au programme. Fonctionnement. A l issue de ce module vous devriez...

Java Licence Professionnelle CISII,

Conception et réalisation d un système d instrumentation distribuée basé sur l architecture Jini

Programmation Objet Java Correction

Système de Virtualisation pour une application de gestion commerciale d entreprise

arcopole Studio Annexe 7 Architectures Site du programme arcopole :

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

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

Sécurisation du réseau

Introduction à Eclipse

Le filtrage de niveau IP

Mettre en place un accès sécurisé à travers Internet

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

Installation d un serveur HTTP (Hypertext Transfer Protocol) sous Débian 6

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

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

Développement des Systèmes d Information

Exécution de PCCOMPTA à distance sous Terminal Server 2003.

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

Architecture JEE. Objectifs attendus. Serveurs d applications JEE. Architectures JEE Normes JEE. Systèmes distribués

Utilisation de Jakarta Tomcat

LES FONCTIONS DE SURVEILLANCE DES FICHIERS

Sommaire Introduction... 3 Le but du projet... 3 Les moyens utilisés... 3 Informations sur le client FTP... 4 Pourquoi une version Linux et

JavaServer Pages (JSP)

Chapitre VII : Principes des réseaux. Structure des réseaux Types de réseaux La communication Les protocoles de communication

Initiation à JAVA et à la programmation objet.

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

Java Licence professionnelle CISII,

Lancement de la simulation SIMBA

TP1 : Initiation à Java et Eclipse

2. MAQUETTAGE DES SOLUTIONS CONSTRUCTIVES. 2.2 Architecture fonctionnelle d un système communicant.

Architectures n-tiers Intergiciels à objets et services web

WEBSERVICES. Michael Fortier. Master Informatique 2ème année. A308, Université de Paris 13

Les différentes méthodes pour se connecter

Transcription:

iut ORSAY DUT Informatique Département Informatique 2008 / 2009 Travaux Pratiques n o 7 : RMI Nom(s) : Groupe : Date : Objectifs : savoir créer des applications client-serveur mettant en jeu des machines virtuelles distantes, les communications reposant sur les Remote Method Invocations (RMI) de Java. 1 Communications réseau en Java Java a été conçu dès ses origines pour réaliser des applications communiquantes. Il offre pour cela diverses possibilités : Les sockets sont l interface standard pour les communications avec le protocole TCP. Elles ont été introduites à l origine dans le monde Unix et sont à présent un standard de fait. Dans ce mode de communication (au travers des classes Socket et ServerSocket), le protocole TCP assure la gestion de la connexion, l envoi, la réception, le séquencement et l assemblage des paquets transmis. L établissement de la connexion et la mise en forme ou l extraction des données envoyées ou reçues sont à la charge du programmeur (ces dernières opérations sont largement facilitées par les classes ObjectInputStream et ObjectOutputStream). Les servlets sont en quelque sorte des serveurs applets qui tirent parti du protocole HTTP en acceptant des requêtes GET ou GET/POST pour renvoyer en général leurs résultats sous la forme d une page HTML, mais elles peuvent être utilisés pour renvoyer n importe quel type de données. Trois différents protocoles permettent à des applications clientes d invoquer des méthodes d objets s exécutant sur un serveur distant. CORBA (Common Object Request Broker Architecture) et SOAP (Simple Object Access Protocol) offrent une large interopérabilité grâce à des langages normalisés (des applications C++ exécutées depuis une plateforme Windows/x86 peuvent communiquer en toute transparence avec d autres écrites en Java sur une plateforme Solaris/UltraSparc). Enfin, Java RMI est présenté plus en détail en Section 2. 2 Remote Method Invocation Java RMI (pour Remote Method Invocation) permet comme CORBA ou SOAP l exécution de méthodes sur des objets distants. À la différence de ces protocoles pensés pour l interopérabilité entre langages, les RMI ont été développées spécifiquement pour Java et offrent ainsi le moyen le plus élégant de communiquer dans ce langage. La complexité de la communication entre applications distances vient d une part du problème de l établissement de la communication et d autre part de la mise en forme des informations à transmettre (par exemple les paramètres de méthodes peuvent être de types différents, en

Travaux Pratiques n o 7 RMI 2/8 nombre différent). Pour simplifier ces tâches, Java les automatise au maximum. Le travail d établissement de connexion, d envoi et de réception d informations encodées est effectué par des objets jouant le rôle de proxy : le stub (ou souche en français) côté client et le skeleton (ou squelette en français) côté serveur. Le principe de communication par RMI est illustré en Figure 1. Ce processus assez complexe est transparent pour le programmeur, en particulier les objets stub et skeleton sont crées et gérés automatiquement. Au final, après avoir récupéré leurs références, on utilise les objets distants aussi aisément que s ils étaient locaux. Client Stub Skeleton Serveur Appel local à la méthode du Stub Envoi des paramètres encodés Appel local à la méthode du serveur Renvoie une valeur ou lève une exception Renvoie une valeur ou lève une exception Envoi d une valeur ou exception encodée Machine virtuelle côté client Machine virtuelle côté serveur FIG. 1 Communications lors d un appel de méthode d un objet distant avec Java RMI 2.1 Interface d un objet communiquant Toutes les méthodes qui pourront être invoquées de manière distante doivent être définies au préalable dans une interface qui hérite de java.rmi.remote. Cet héritage oblige toutes les méthodes définies dans l interface à déclarer qu elles sont susceptibles de renvoyer l exception java.rmi.remoteexception. Cette interface sera indispensable à l objet exécuté sur le serveur qui devra l implémenter. Elle est aussi nécessaire au stub et au skeleton, mais cet aspect est transparent pour le programmeur. Le code suivant correspond à une interface déclarant une seule méthode getmessage qui pourra être invoquée de manière distante : import j a v a. rmi. ; / C l a s s e M e s s a g e I n t e r f a c e d é c l a r a n t l e s p r o t o t y p e s de méthodes q u i p o u r r o n t ê t r e i n v o q u é e s à d i s t a n c e. / p u b l i c i n t e r f a c e M e s s a g e I n t e r f a c e extends Remote { p u b l i c S t r i n g getmessage ( ) throws Rem otee xception ;

Travaux Pratiques n o 7 RMI 3/8 2.2 Objet communiquant Pour réaliser un objet dont certaines méthodes pourront être invoquées à distance, il suffit d une part que sa classe hérite de java.rmi.server.unicastremoteobject (il y a d autres possibilités mais qui ne seront pas abordées dans ce TP) et d autre part qu il implémente une interface qui hérite de java.rmi.remote où sont définies les méthodes invoquables à distance (voir Section 2.1). Son constructeur (ainsi que toutes les méthodes définies dans la ou les interfaces héritant de java.rmi.remote) doit déclarer l exception java.rmi.remoteexception. Le code suivant correspond à un objet Message destiné à véhiculer une simple chaîne de caractères et possédant une seule méthode getmessage qui pourra être invoquée de manière distante : import j a v a. rmi. ; import j a v a. rmi. s e r v e r. ; / C l a s s e Message d e s t i n é e à v é h i c u l e r des c h a î n e s de c a r a c t è r e s. Sa méthode getmessage p e u t ê t r e i n v o q u é e à d i s t a n c e. / p u b l i c c l a s s Message extends U n i c a s t R e m o t e O b j e c t implements M e s s a g e I n t e r f a c e { p r i v a t e S t r i n g message ; p u b l i c Message ( S t r i n g message ) throws Rem otee xception { t h i s. message = message ; p u b l i c S t r i n g getmessage ( ) throws Rem otee xception { return message ; 2.3 Serveur Le rôle d une application serveur est tout d abord de créer et d installer un gestionnaire de sécurité par un appel à la méthode System.setSecurityManager. C est un aspect fondamental car il est toujours délicat d accepter une connexion et d échanger des informations avec une machine distante. Le gestionnaire de sécurité tiendra compte d un fichier de configuration qu on lui précisera au moment de la compilation (voir Section 2.5). Nous utiliserons un fichier extrêmement laxiste puisqu il autorise tout, on l appelera no.policy et on le placera au même endroit que les codes source : g r a n t { ; p e r m i s s i o n j a v a. s e c u r i t y. A l l P e r m i s s i o n ; Pour une mise en production il sera nécessaire de consulter la documentation Java pour créer un fichier n autorisant que le strict nécessaire, mais il conviendra dans le cadre de ce TP. Pour mettre à disposition un objet à des clients, le serveur doit d une part créer cet objet et d autre part l enregistrer auprès du serveur de nom Java. Cette dernière opération se réalise par un appel à la méthode Naming.rebind. Le premier argument de cette méthode est le nom symbolique de l objet, de la forme //machine:port/nom où machine est le nom ou l adresse IP du serveur, port est le port d accès (optionnel, par défaut 1099) et nom est le nom qu on choisit de donner à l objet sur ce serveur. Le second argument est une référence à l objet. Le code suivant est celui d un serveur créant et mettant à disposition un objet de type Message :

Travaux Pratiques n o 7 RMI 4/8 import j a v a. rmi. ; / C l a s s e S e r v e u r m e t t a n t en p l a c e des o b j e t s pour e f f e c t u e r des RMI. / p u b l i c c l a s s S e r v e u r { p r i v a t e s t a t i c f i n a l S t r i n g IP_SERVEUR = " 1 9 2. 1 6 8. 0. 1 " ; / / À a d a p t e r! p r i v a t e s t a t i c f i n a l S t r i n g NOM_SERVICE = " SMessage " ; p u b l i c s t a t i c void main ( S t r i n g [ ] a r g s ) { / / C r é a t i o n e t i n s t a l l a t i o n du g e s t i o n n a i r e de s é c u r i t é. System. s e t S e c u r i t y M a n a g e r ( new RMISecurityManager ( ) ) ; t r y { / / C r é a t i o n e t e n r e g i s t r e m e n t d un o b j e t Message Naming. r e b i n d ( " / / " + IP_SERVEUR + " / "+ NOM_SERVICE, new Message ( " h e l l o, world " ) ) ; System. o u t. p r i n t l n ( " S e r v e u r OK! " ) ; catch ( E x c e p t i o n e ) { System. o u t. p r i n t l n ( " S e r v e u r KO : " + e. getmessage ( ) ) ; 2.4 Client Le rôle d une application cliente est tout d abord de créer et d installer un gestionnaire de sécurité de la même manière que pour un serveur (voir Section 2.3). Pour travailler avec un objet distant, le client doit récupérer une référence à cet objet. Cela est réalisé grâce à la méthode Naming.lookup qui prend en argument le nom symbolique de l objet (voir Section 2.3) et qui lance les communications nécessaires (transparentes pour le programmeur) entre le stub et le skeleton pour trouver cette référence. Le client ne connaissant pas la définition de l objet distant (il ne dispose pas de son.class) mais seulement l interface qu il implémente, on utilisera le polymorphisme de Java pour ranger la référence de l objet dans une référence à une classe implémentant l interface. Voici le code d un client invoquant la méthode getmessage d un objet Message distant : import j a v a. rmi. ; / C l a s s e C l i e n t u t i l i s a n t des methodes d un o b j e t d i s t a n t pour t r a v a i l l e r. / p u b l i c c l a s s C l i e n t { p r i v a t e s t a t i c f i n a l S t r i n g IP_SERVEUR = " 1 9 2. 1 6 8. 0. 1 " ; / / À a d a p t e r! p r i v a t e s t a t i c f i n a l S t r i n g NOM_SERVICE = " SMessage " ; p u b l i c s t a t i c void main ( S t r i n g [ ] a r g s ) { / / C r é a t i o n e t i n s t a l l a t i o n du g e s t i o n n a i r e de s é c u r i t é. System. s e t S e c u r i t y M a n a g e r ( new RMISecurityManager ( ) ) ; t r y { / / R é c u p é r a t i o n d une r é f é r e n c e à un Message d i s t a n t M e s s a g e I n t e r f a c e m = ( M e s s a g e I n t e r f a c e ) Naming. lookup ( " / / "+IP_SERVEUR+" / "+NOM_SERVICE ) ; / / On p e u t à p r é s e n t f a i r e a p p e l à s e s méthodes. System. o u t. p r i n t l n (m. getmessage ( ) ) ; catch ( E x c e p t i o n e ) { System. o u t. p r i n t l n ( " C l i e n t KO : " + e. getmessage ( ) ) ;

Travaux Pratiques n o 7 RMI 5/8 Les section suivantes décrivent la mise en place d une application simple utilisant les Java RMI pour communiquer. Les codes source sont ceux des sections précédentes. Suivez avec une attention particulière l ordre et les indications pour construire cette application. Eclipse a besoin d un plugin pour gérer les RMI, ne l utilisez que pour éditer votre code si vous le désirez, mais pas pour l exécuter. 2.5 Compilation d une application communiquante 2.5.1 Compilation du serveur Le serveur possède tous les fichiers décrits précedemment (interfaces, objets distants, serveur, fichier de politique de sécurité) mais pas celui du client. On compile le serveur fourni en exemple dans les sections précéntes par la commande suivante, dans le répertoire où se trouvent les fichiers source (à adapter si vous avez fait des packages) : javac MessageInterface.java Message.java Serveur.java Utiliser javac.exe sous Windows, et si cette commande n est pas dans le PATH, on utilisera son chemin complet de la forme C:\Program Files\Java\jdkx.x.x\bin\javac.exe. De manière générale, et sauf indication contraire, ajoutez simplement le suffixe.exe aux commandes Linux si vous travaillez sous Windows et utilisez le chemin complet si nécessaire (toutes les commandes Java se trouvent dans le répertoire du JDK donné ci-avant). Ensuite on va créer automatiquement les stub et skeleton par la commande : rmic -keep Message L option -keep demande de conserver les sources Java que l on pourra regarder. En particulier cette commande devrait créer un fichier Message_Stub.class. Attention si vous avez fait un package monpackage, il faudra exécuter cette commande depuis le répertoire au dessus du package et utiliser le nom complet de la classe : rmic -keep monpackage.message. 2.5.2 Compilation du client La compilation du programme client requiert les sources du client, un fichier de politique de sécurité, mais aussi la ou les interfaces implémentées par les objets distants dont il aura besoin et pour chacun d entre eux le fichier.class du stub correspondant. Dans une utilisation propre, le fournisseur d accès à un serveur met à disposition à une adresse accessible par Internet une archive jar (voir TP sur les applets) contenant les interfaces et les stubs des objets qu on peut invoquer de manière distante. Pour ce TP, on se contentera de copier les.class de l interface et du stub auprès du code du client. On compilera ensuite le client par la commande (à adapter si vous avez fait des packages) : javac Client.java 2.6 Lancement d une application communiquante 2.6.1 Lancement du serveur Avant de lancer le serveur, deux opérations sont importantes. Tout d abord il faut s assurer que les classes de stub/skeleton soient dans le CLASSPATH (cette variable d environnement indique à Java où chercher toutes les classes dont il aurait besoin) :

Travaux Pratiques n o 7 RMI 6/8 Sous Linux : export CLASSPATH=chemin_vers_les_classes Sous Windows : set CLASSPATH=chemin_vers_les_classes La seconde opération est de lancer le serveur de noms Java, qui permet aux clients d obtenir la référence à un objet à l aide de son nom symbolique, par la commande : Sous Linux : rmiregistry & Sous Windows (attention à bien lancer la version de rmiregistry correspondant à votre dernier JDK et non une autre, s il y a un problème par exemple unmarshalling error, utilisez le nom complet jusqu à l exécutable correct) : start rmiregistry Enfin, on peut lancer le serveur par la commande : java -Djava.security.policy=no.policy Serveur 2.6.2 Lancement du client Le lancement du client est plus simple et se fait par la commande : java -Djava.security.policy=no.policy Client Réalisez et exécutez cette application. Décrivez en quelques phrases et/ou par un schéma votre compréhension des échanges entre le client et le serveur au cours de l exécution de cette application.

Travaux Pratiques n o 7 RMI 7/8 3 Estimation de π Le but de ce problème est de construire une application client-serveur utilisant Java RMI comme moyen de communication pour trouver une approximation du nombre π. La méthode utilisée pour calculer une valeur approchée de π, appelée méthode de Monte-Carlo, est d effectuer des tirages aléatoires de nombres réels x et y tels qu ils soient compris entre 0 et 1. Si N est le nombre de tirages de couples x et y, et M le nombre de tirages tels que x 2 +y 2 1, alors on a π (4M)/N. Pour ce problème, un programme appelé pi va faire des appels à un autre programme appelé tirage s exécutant sur une autre machine pour lui demander un nombre aléatoire entre 0 et 1. Pour cela, pi invoquera une méthode distante de tirage. Le programme tirage calculera alors le nombre et l enverra en valeur de retour. Quand pi aura fait une demande et reçu les réponses pour x et pour y, il calculera si x 2 + y 2 1. Il affichera après chaque demande de x et y son évaluation de π qui devrait être de plus en plus précise. Décrivez l organisation des communications entre les deux programmes. Dans ce schéma, qui est le client et qui est le serveur? Réalisez cette application, vous joindrez le code source au compte-rendu de TP. Utilisez votre programme client pour qu il puisse fonctionner avec le serveur d un autre binôme. Qu a-t-il fallu modifier?

Travaux Pratiques n o 7 RMI 8/8 4 Communication bidirectionnelle : talk Lorsqu il est question d invocation de méthodes à distance, la distinction entre client et serveur n a lieu que pour une seule invocation : un client demande un service à un serveur, mais rien n empêche ensuite les rôles de s inverser. La commande talk du monde Unix permet à deux utilisateurs de discuter entre eux en s envoyant des messages textuels (en quelque sorte, il s agit d un chat limité à deux utilisateurs). On souhaite créer en Java une application talk qui peut à la fois envoyer des messages vers une autre application talk distante (par transmission d un message en argument d une méthode distante qui affichera ce message) et recevoir des messages (en proposant de la même façon un objet dont on pourra invoquer des méthodes à distance et qui affichera les messages reçus). Réalisez cette application dont vous joindrez le code source au compte-rendu de TP. Commencez par une application purement en mode texte, puis utilisez le temps qu il vous restera pour lui confectionner une interface graphique. Pensez à strictement décomposer moteur de communication et interface graphique.