Programmation Réseau RMI. Jean-Baptiste.Yunes@univ-paris-diderot.fr armand@informatique.univ-paris-diderot.fr. ! UFR Informatique



Documents pareils
Remote Method Invocation (RMI)

Calcul Parallèle. Cours 5 - JAVA RMI

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

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

Remote Method Invocation en Java (RMI)

Conception de serveurs d'applications ouverts

RMI le langage Java XII-1 JMF

Remote Method Invocation Les classes implémentant Serializable

Programmation répartie RPC & RMI

Intergiciel - concepts de base

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

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

Java Naming and Directory Interface

Java - RMI Remote Method Invocation. Java - RMI

Auto-évaluation Programmation en Java

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

Programmer en JAVA. par Tama

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

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

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

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Corrigé des exercices sur les références

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

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

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

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

Un ordonnanceur stupide

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

PROGRAMMATION PAR OBJETS

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

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

Synchro et Threads Java TM

GEI 465 : Systèmes répartis

Initiation à JAVA et à la programmation objet.

OpenPaaS Le réseau social d'entreprise

Création d une application JEE

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

Java DataBaseConnectivity

Projet gestion d'objets dupliqués

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

Programmation Objet Java Correction

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

Cours 1: Java et les objets

TP1 : Initiation à Java et Eclipse

Développement Logiciel

Chapitre 10. Les interfaces Comparable et Comparator 1

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

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

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

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

Java c est quoi? Java pourquoi?

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

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

Premiers Pas en Programmation Objet : les Classes et les Objets

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

Programmation Orientée Objet - Licence TIS CM8/9. Rappel sur la séance précédente. Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers.

2 Chapitre 1 Introduction

Threads. Threads. USTL routier 1

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

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

Bases du langage. Historique Applications et applets Éléments de base du langage Classes et objets Les exceptions

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

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

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

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Java 1.5 : principales nouveautés

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

Architecture applicative et Cartographie

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

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

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Applet pour visualiser les variables «automate» notifiées

ACTIVITÉ DE PROGRAMMATION

Une introduction à Java

Java Licence professionnelle CISII,

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 )

EXA1415 : Annotations

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

OS Réseaux et Programmation Système - C5

Une introduction à la technologie EJB (2/3)

Programmation Par Objets

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

Utiliser Java sans BlueJ

Java - la plateforme

Package Java.util Classe générique

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

Facultés Universitaires Notre-Dame de la Paix. Conception et Programmation Orientées- Object

JOnAS Day 5.1. Clustering

Projet de programmation (IK3) : TP n 1 Correction

INITIATION AU LANGAGE JAVA

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

Langage Java. Classe de première SI

as Architecture des Systèmes d Information

Étude de l interopérabilité de deux langages de programmation basée sur la machine virtuelle de Java

La JVM. La machine virtuelle Java. La JVM. La JVM

TP Programmation Java / JDBC / Oracle

Introduction : les processus. Introduction : les threads. Plan

Transcription:

Programmation Réseau RMI Jean-Baptiste.Yunes@univ-paris-diderot.fr armand@informatique.univ-paris-diderot.fr UFR Informatique 2014

Les RMI de Java Les applications RMI sont des applications bâties sur le modèle objet de Java et dans lesquelles les objets sont répartis dans différents processus (en général sur différentes machines) on comprend donc : l usage fait du réseau pour communiquer entre objets la difficulté mais aussi l intérêt de faciliter les appels de méthodes 2

machine away appli Y machine far objet B appli X objet A 3

L idée est de rendre transparente la manipulation d objets distants Un appel de méthode sur un objet distant doit être syntaxiquement le même qu un appel de méthode sur un objet local Idée : masquer (au programmeur) les communications nécessaires dans un objet : dont l interface est exactement celle de l objet distant qui délègue tous les appels, à travers le réseau, à l objet distant 4

Le schéma général est alors le suivant : sdsu.edu Ce mécanisme repose sur une technique bien connue de délégation : Le design pattern proxy 5

Pour les RMI, la terminologie est différente (mais le principe reste le même) et s inspire de celle des RPC : le proxy côté client s appelle un talon (stub) le proxy côté serveur est un squelette (skeleton) http://www.javvin.com/protocolrpc.html 6

Bien entendu de nombreux problèmes sont à résoudre : Comment créer les talons et squelettes? Comment localiser un objet distant? 7

Schéma général 1. définir une interface pour l objet 2. créer un objet qui l implémente 3. le nommer et le faire apparaître dans un annuaire machine hal 2 annuaire machine away 3 appli Y object 8

Schéma général 4. récupérer une référence sur l objet 5. invoquer une méthode sur l objet via la référence machine hal annuaire machine far appli X 4 machine away appli Y objet A 5 object 9

Tout d abord, côté serveur : Tout objet qui désire être exposé à travers les RMI doit : implémenter une interface qui elle-même doit : spécialiser l interface java.rmi.remote contenir des méthodes dont la signature contient une clause throws faisant apparaître l exception java.rmi.remoteexception dont tous les paramètres ou valeurs de retour doivent être sérialisables, i.e. implémenter l interface java.io.serializable spécialiser la classe java.rmi.server.unicastremoteobject 10

// L interface qui sera exposée import java.rmi.*; import java.io.*; public interface ODI extends Remote { public int getrandom() throws RemoteException; public int getcalls() throws RemoteException; 11

// Une implémentation de l interface import java.rmi.*; import java.rmi.server.*; import java.io.*; import java.util.*; public class OD extends UnicastRemoteObject implements ODI { private Random alea; private int calls; public OD() throws RemoteException { log("ctor"); alea = new Random(); calls = 0; public int getrandom() throws RemoteException { log("getrandom() "+this); calls++; return alea.nextint(); public int getcalls() throws RemoteException { log("getcalls() "+this); return calls; 12

Pour que l objet soit atteignable par un client : il faut l enregistrer dans un annuaire des objets exposés cela suppose qu un annuaire soit disponible un tel annuaire s appelle un registre RMI (RMI registry) le service réseau correspondant est fourni par défaut avec l environnement Java; la commande s appelle rmiregistry 13

il faut lancer un annuaire attention, car l annuaire peut-être conduit à charger les classes nécessaires 14

L enregistrement d un objet peut simplement s effectuer à l aide de la méthode statique : void bind(string nom,remote o); de la classe java.rmi.naming où : nom est de la forme //machine:port/id (machine et port sont optionnels) o est l objet à exposer 15

ou alors à l aide en retrouvant un annuaire via : LocateRegistry.getRegistry( ) puis en utilisant : void bind(string nom,remote o); de la classe java.rmi.registry.registry 16

Attention, bind() peut échouer si un objet a déjà été enregistré sous ce nom, on peut alors utiliser rebind() 17

// Le serveur qui expose l objet URL de l annuaire en pratique jamais rien d autre que import java.rmi.*; localhost import java.io.*; public class Serveur { public static void main(string []args) { try { OD o = new OD(); Naming.bind("rmi://localhost/od",o); System.out.println("C'est bon "+o); catch(exception e) { System.out.println("ERREUR"); e.printstacktrace(); 18

il faut lancer le serveur d où les classes utiles seront-elles obtenues? 19

Pour atteindre l objet, côté client, il suffit : d interroger le registre via la méthode statique (Object)lookup(String nom); de la classe Naming d utiliser l objet ordinairement pour y appeler des méthodes attention, il est plus prudent de ne considérer que le type de l interface pour le type de l objet renvoyé 20

// Le client quel est l objet que import java.rmi.*; import java.io.*; l on souhaite? public class Client { public static void main(string []args) { try { ODI o = (ODI)Naming.lookup("//localhost/od"); System.out.println("OD="+o); for (int i=0; i<10; i++) { System.out.println("Rand(i) = "+o.getrandom()); System.out.println("Calls : "+o.getcalls()); catch (Exception e) { e.printstacktrace(); 21

22

Rappelons que l univers Java est protégé par différent mécanismes de sécurité les RMIs sont aussi sous le couvert d une politique de sécurité, deux façons de les paramétrer : installer en interne un SecurityManager adéquat surcharger en externe le paramétrage de la politique de sécurité, via la propriété java.security.policy 23

pour le paramétrage externe : lancer la JVM en spécifiant quel fichier contient les paramètres de sécurité avec la commande java -Djava.security.policy=fichier créer un fichier spécifiant les valeurs des paramètres, comme (ici la politique la moins restrictive) : grant { permission java.security.allpermission; 24

Il est possible de créer un annuaire depuis le serveur lui-même 25

// Un serveur-annuaire import java.rmi.*; import java.rmi.registry.*; import java.io.*; public class ServeurAutoRegistry { public static void main(string []args) { try { Registry a = LocateRegistry.createRegistry( Registry.REGISTRY_PORT); OD o = new OD(); a.rebind("od",o); System.out.println("C'est bon "+o); catch(exception e) { System.out.println("ERREUR"); e.printstacktrace(); 26

On notera : que l enregistrement d un UnicastRemoteObject crée un Thread côté serveur; ce Thread est dédié à la gestion de la communication côté serveur l utilisation intensive des exceptions (beaucoup de communications sont cachées et les erreurs doivent être traitées) que des problèmes de concurrence peuvent apparaître que des problèmes de fiabilité peuvent apparaître (un client - un serveur peut disparaître brutalement) que le garbage collector est particulier (dgc + interface Unreferenced) 27

Activation L activation d objets Dans le modèle des objets distribués précédent les objets préexistent côté serveur Si l on souhaite obtenir quelque chose qui se rapproche plus du modèle des services (à la mode du super-démon d Unix) on peut utiliser l activation à la demande d objets distants Les objets ne sont instanciés qu à réception d une requête Il s agit du mécanisme d activation d objets 28

Activation il est important de savoir que les objets activables sont regroupés par groupe d activation qu une JVM prendra en charge un groupe qu un démon se chargera d activer une JVM lorsque nécessaire 29

Activation Du côté serveur, un objet activable doit : étendre la classe Remote étendre la classe java.rmi.activation.activatable implémenter un constructeur à deux arguments de type java.rmi.activationactivationid java.rmi.marshalledobject<t> 30

Activation Ensuite il est nécessaire de créer un programme permettant la mise en place qui consiste à : positionner une politique de sécurité adaptée pour la JVM qui sera lancée création d un groupe d activation ou rejoindre un groupe d activation (une JVM par groupe d activation) déclaration après du système de nommage 31

Activation La commande rmid correspond au démon qui prend en charge les (groupes d ) objets activables cette commande doit être utilisée en partenariat avec le registre RMI rmiregistry 32

Activation // Interface de l objet activable import java.rmi.*; public interface Hello extends Remote { String hello(string name) throws RemoteException; 33

Activation // Implémentation de l interface import java.rmi.*; import java.rmi.activation.*; import java.io.*; class ConcreteHello extends Activatable implements Hello { private String name; public ConcreteHello(ActivationID id, MarshalledObject<String> o) throws RemoteException,IOException, ClassNotFoundException { super(id,0); name = o.get(); System.out.println("ctor ConcreteHello("+id+") name="+name); public String hello(string name) throws RemoteException { System.out.println("hello called"); try { Thread.sleep(20000); catch(exception e) { return "I am "+this.name+", I say hello "+name; 34

Activation Création du groupe public class Startup { public static void main(string[] args) throws Exception { // Politique de sécurité de la JVM activée Properties props = new Properties(); props.put("java.security.policy", "grouppolicy"); // paramètres de la JVM ActivationGroupDesc.CommandEnvironment ace = null; // Création d'un descripteur du groupe ActivationGroupDesc group = new ActivationGroupDesc(props, ace); // Enregistrement du groupe auprès du rmid ActivationSystem as = ActivationGroup.getSystem(); ActivationGroupID agi = as.registergroup(group); ); 35

Activation // objet qui sera passé en paramètre du constructeur MarshalledObject<String> data = new MarshalledObject<String>("serveur"); // Création du descripteur de l objet activable ActivationDesc desc = new ActivationDesc(agi,"ConcreteHello", "file:/users/yunes/desktop/activation/",data); // Enregistrement de l objet activable auprès du rmid // et Récupération de la souche Hello obj = (Hello)Activatable.register(desc); // Enregistrement de la souche auprès du rmiregistry Naming.rebind("HelloServer", obj); 36

Activation // Un client invoque un objet activable import java.rmi.*; import java.rmi.registry.*; import java.io.*; public class Client { public static void main(string []args) { try { Registry registry = LocateRegistry.getRegistry("localhost"); System.out.println("Registry is "+registry); Hello o = (Hello) registry.lookup("helloserver"); System.out.println("Hello="+o); System.out.println(o.hello(args[0])); catch (Exception e) { e.printstacktrace(); 37