le langage java Remote Method Invocation (RMI)

Documents pareils
RMI le langage Java XII-1 JMF

Remote Method Invocation (RMI)

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

Remote Method Invocation en Java (RMI)

Remote Method Invocation Les classes implémentant Serializable

Calcul Parallèle. Cours 5 - JAVA RMI

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

Programmation répartie RPC & RMI

Conception de serveurs d'applications ouverts

Intergiciel - concepts de base

Programmer en JAVA. par Tama

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

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

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>

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

Programmation Par Objets

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Package Java.util Classe générique

TP1 : Initiation à Java et Eclipse

Chapitre 10. Les interfaces Comparable et Comparator 1

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

Synchro et Threads Java TM

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

Projet de programmation (IK3) : TP n 1 Correction

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

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

Java Licence Professionnelle CISII,

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

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

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

Auto-évaluation Programmation en Java

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

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

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

Corrigé des exercices sur les références

Java DataBaseConnectivity

as Architecture des Systèmes d Information

Java - RMI Remote Method Invocation. Java - RMI

Cours 1: Java et les objets

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

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

Introduction au langage Java

Programmation Objet Java Correction

INITIATION AU LANGAGE JAVA

Création d une application JEE

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

Java 1.5 : principales nouveautés

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

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

ACTIVITÉ DE PROGRAMMATION

Une introduction à Java

ALGORITHMIQUE ET PROGRAMMATION ORIENTEE OBJET

Programmation par les Objets en Java

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

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

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

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 )

PROGRAMMATION PAR OBJETS

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

OpenPaaS Le réseau social d'entreprise

OS Réseaux et Programmation Système - C5

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

Objets et Programmation. origine des langages orientés-objet

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

JAVA. Introduction à la programmation objet avec java 1/4. Nadir BOUSSOUKAIA

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Langage Java. Classe de première SI

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

INF 321 : mémento de la syntaxe de Java

TD/TP PAC - Programmation n 3

Chapitre I Notions de base et outils de travail

Projet gestion d'objets dupliqués

Utiliser Java sans BlueJ

Programme Compte bancaire (code)

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

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

Un ordonnanceur stupide

Initiation à JAVA et à la programmation objet.

Java Licence Professionnelle CISII,

TD/TP PAC - Programmation n 3

Tp 1 correction. Structures de données (IF2)

TP1. Outils Java Eléments de correction

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

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

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

Chapitre VI- La validation de la composition.

7 Développement d une application de MapReduce

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Environnements de développement (intégrés)

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Programmation Réseau SSH et TLS (aka SSL)

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

TP Programmation Java / JDBC / Oracle

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

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). RMI apparaît avec Java 1.1 et est complètement intégré dans Java 1.1 donc est gratuit ( CORBA) C'est un bon pas vers 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). Si on veut être hétérogène coté client et coté serveur, il faut utiliser CORBA. C'est un peu du "RPC orienté objet". Un objet local demande une fonctionnalité à un objet distant. Il y a donc une machine virtuelle Java des 2 cotés. Ces manipulations sont "relativement" transparente. 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. pas dans IE 3.0. Dans netscape 3.0 la classe sunw.io.objioapplethelper doit être présente dans le répertoire repéré par CODEBASE) et l'url doit être htpp:// (et non file://). 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 interfaces pour les classes distantes. 2 ) Créer et compiler les implémentations de ces classes. 3 ) Créer les classes pour la souche et le skeleton à l'aide de la commande rmic. 4 ) Créer et compiler une application serveur. 5 ) lancer le rmiregister et lancer l'application serveur. 6 ) Créer et compiler un programme client qui accède à des objets distants du serveur. 7 ) lancer ce client. Un exemple classique : serveur bancaire Un gestionnaire de comptes bancaires est capable de gérer plusieurs comptes. Il sera placé sur une machine distante, interrogé et manipulé par des clients. exemple inspiré de [JDH] chapitre 12. XII-4

1 ) définir les interfaces pour les classes distantes. Les classes placées à distance sont spécifiées par des interfaces qui doivent implémenter java.rmi.remote et dont les méthodes lèvent une java.rmi.remoteexception exception. On définit alors 2 interfaces CreditCard et CreditManager. package credit; import credit.*; import java.rmi.*; public interface CreditCard extends Remote { /** retourne le credit sur ce compte */ public float getcreditline() throws RemoteException; /** permet de faire un achat de amount francs. Leve une exception si la somme est supérieure au credit bancaire.*/ public void makepurchase(float amount, int signature) throws RemoteException, InvalidSignatureException, CreditLineExceededException; /** positionne la signature de ce compte bancaire. */ public void setsignature(int pin) throws RemoteException; XII-5

1 ) définir les interfaces pour les classes distantes (suite) package credit; import credit.*; import java.rmi.*; public interface CreditManager extends java.rmi.remote { /** recherche le compte bancaire d'une personne. S'il n'en a pas en crée un et le retourne.*/ public CreditCard findcreditaccount(string Customer) throws DuplicateAccountException, RemoteException; /** crée un nouveau compte bancaire pour la personne newcustomer */ public CreditCard newcreditaccount(string newcustomer) throws RemoteException; XII-6

2 ) Créer et compiler les implémentations de ces classes. Il s'agit d'écrire 2 classes qui implémentent les interfaces ci dessus. En général ces classes ont pour nom nominterfaceimpl. Ces classes doivent dériver de java.rmi.server.unicastremoteobject. package credit; import java.rmi.*; import java.rmi.server.*; import java.io.serializable; public class CreditCardImpl extends UnicastRemoteObject implements CreditCard, Serializable { private float creditline = 5000f; private int signature = 0; private String accountname; public CreditCardImpl(String customer) throws RemoteException, DuplicateAccountException { accountname = customer; public float getcreditline() throws RemoteException { return creditline; XII-7

public void setsignature(int pin) throws RemoteException { signature = pin; /** effectue un achat en s'assurant : - de la bonne signature - que l'achat est inférieure au credit.*/ public void makepurchase(float amount, int signature) throws RemoteException, InvalidSignatureException, CreditLineExceededException { if (signature!= this.signature) { throw new InvalidSignatureException(); if (amount > creditline) { throw new CreditLineExceededException(); else { creditline -= amount; XII-8

2 ) Créer et compiler les implémentations de ces classes (suite) package credit; import java.rmi.*; import java.rmi.server.*; import java.util.hashtable; public class CreditManagerImpl extends UnicastRemoteObject implements CreditManager { private static transient Hashtable accounts = new Hashtable(); /** Le constructeur par défaut qui ne fait rien d'autre qu'appeler super() */ public CreditManagerImpl() throws RemoteException { /** Crée un nouveau compte. Entre autre ajoute le nouveau client dans la hashtable accounts */ public CreditCard newcreditaccount(string customername) throws RemoteException { CreditCardImpl newcard = null; try { newcard = new CreditCardImpl(customerName); catch (DuplicateAccountException e) { return null; accounts.put(customername, newcard); return newcard; XII-9

/** recherche un compte bancaire pour le client customer. S'il n'en trouve pas, retourne en crée un et le retourne */ public CreditCard findcreditaccount(string customer) throws DuplicateAccountException, RemoteException { CreditCardImpl account = (CreditCardImpl)accounts.get(customer); if (account!= null) { return account; account = new CreditCardImpl(customer); accounts.put(customer, account); return account; Pour compiler utiliser les commandes : javac -d. CreditCard.java javac -d. CreditCardImpl.java javac -d. CreditManager.java javac -d. CreditManagerImpl.java Ces commandes vont créer les fichiers.class et les déposer dans./credit. XII-10

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..nombasebyteco de1 paquetage.souspaquetage..nombasebyteco de2... On a donc ici : rmic -d. credit.creditcardimpl credit.creditmanagerimpl ce qui crée 4 classes dans le répertoire credit : CreditCardImpl_Skel.class, CreditCardImpl_Stub.class, CreditManagerImpl_Skel.class, CreditManagerImpl_Stub.class. XII-11

4 ) Créer et compiler une application serveur C'est le programme qui sera à l'écoute des demandes des clients. Ce programme crée un objet CreditManagerImpl qui attend alors les requêtes. package credit; import java.util.*; import java.rmi.*; public class CardBank { public static void main (String args[]) { // Cree et installe un security manager. System.setSecurityManager(new RMISecurityManager()); try { // Cree un gestionnaire bancaire System.out.println("CardBank: gestionnaire bancaire cree"); CreditManagerImpl cmi = new CreditManagerImpl(); // enregistre ce gestionnaire bancaire // dans le registre des objets disponibles. System.out.println("CardBank: bind le gestionnaire"); Naming.rebind("cardManager", cmi); catch (Exception e) { e.printstacktrace(); System.out.println(e.getMessage()); XII-12

4 ) Créer et compiler une application serveur (suite) Il faut pour un serveur d'objet installé un SecurityManager spécifique. Celui-ci est donné par Java et on l'installe par : System.setSecurityManager(new RMISecurityManager()); Pour rendre l'objet gestionnaire bancaire 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("cardManager", cmi); Par la suite cet objet serveur bancaire sera accessible par les autres machines en indiquant la machine sur laquelle est exécuté ce serveur et son nom (cf. ci dessous). Le premier argument de Naming.rebind() doit être : rmi://nomserveurrmi:port/nom. Par défaut nomserveurrmi est la machine locale qui contient le serveur RMI et port est 1099. Cet "URL rmi" sera utilisé par les clients pour interroger le serveur grâce à l'appel Naming.lookup(). On compile ce serveur par : javac -d. CardBank.java XII-13

5 ) lancer le rmiregister et lancer l'application serveur Il faut d'abord lancer le rmiregister puis le serveur. % rmiregister & % java credit.cardbank Ce qui rend maintenant le serveur disponible pour de futur clients. Les sorties du serveur sont : CardBank: gestionnaire bancaire cree CardBank: bind le gestionnaire XII-14

6 ) Créer et compiler un programme client qui accède au serveur Le programme doit être lancé par : % java ClientBancaire serveurrmi nomclient package credit; import java.rmi.*; public class ClientBancaire{ public static void main(string args[]) { CreditManager cm = null; CreditCard account = null; // verifie la ligne de commande if (args.length < 2) { System.err.println("Usage : "); System.err.println("java ClientBancaire <server> <account name>"); System.exit (1); // Cree et installe un security manager. System.setSecurityManager(new RMISecurityManager()); XII-15

// recupere une reference sur le // gestionnaire bancaire distant. try { String url = new String ("rmi://" + args[0] + "/cardmanager"); System.out.println ("ClientBancaire recherche le gestionnaire bancaire a l' url = " + url); cm = (CreditManager)Naming.lookup(url); catch (Exception e) { System.out.println("Erreur a l'acces du gestionnaire bancaire" + e); // recupere le compte bancaire (distant) // du client. try { account = cm.findcreditaccount(args[1]); System.out.println ("recherche du compte de " + args[1]); catch (Exception e) { System.out.println("Erreur a la recherche du compte de " + args[1]); XII-16

// effectue des transactions. try { System.out.println("credit disponible : " + account.getcreditline()); System.out.println("Changement de signature"); account.setsignature(1234); System.out.println("un achat de 100 F"); account.makepurchase(100.00f, 1234); System.out.println("credit disponible : " + account.getcreditline()); System.out.println("second achat de 160 F"); account.makepurchase(160.00f, 1234); System.out.println("credit disponible : "+ account.getcreditline()); catch (Exception e) { System.out.println("Erreur dans les transactions pour " + args[1]); System.exit(0); remarque : le code ci dessus manipule les objets distants comme s'ils étaient locaux. Après avoir installé un security manager RMI, le client recherche le serveur bancaire distant par Naming.lookup(url) où url est une "URL rmi" de la forme rmi://machineduserveurrmi:port/nomgest ionnairebancaire 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 caster. XII-17

7 ) lancer ce client par % java ClientBancaire serveurrmi nomclient Bibliographie [JDH] Java 1.1 developer's Handbook Philip Heller, Simon Roberts ed Sybex. Java client-serveur Cédric Nicolas et al. collection fi-system ed Eyrolles Remote Method Invocation Specification à : http://www.javasoft.com/products/jdk/1.1/docs/guide/rmi/spec/rmitoc.doc.html XII-18