Programmation orientée objet en langage JAVA



Documents pareils
Remote Method Invocation (RMI)

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

RMI le langage Java XII-1 JMF

Remote Method Invocation Les classes implémentant Serializable

Remote Method Invocation en Java (RMI)

Calcul Parallèle. Cours 5 - JAVA RMI

Conception de serveurs d'applications ouverts

Intergiciel - concepts de base

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

Programmation répartie RPC & RMI

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Java - RMI Remote Method Invocation. Java - RMI

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

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

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

TP1. Outils Java Eléments de correction

Initiation à JAVA et à la programmation objet.

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

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

Java Naming and Directory Interface

Projet gestion d'objets dupliqués

Traitement de données

Présentation de Java. Olivier de Pertat IT GROUP

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

Le Modèle de Sécurité dans JAVA

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

PROGRAMMATION PAR OBJETS

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

Java DataBaseConnectivity

TP1 : Initiation à Java et Eclipse

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

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

Programmation avancée et répartie en Java : interfaçage avec d autres langages

OS Réseaux et Programmation Système - C5

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

Introduction au langage Java

Un ordonnanceur stupide

NFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007

Tutoriel d installation de Hibernate avec Eclipse

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

as Architecture des Systèmes d Information

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

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

Une introduction à Java

Programmer en JAVA. par Tama

Java Licence professionnelle CISII,

Auto-évaluation Programmation en Java

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

Introduction à CORBA

Cours 1: Java et les objets

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

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

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

Programmation Objet Java Correction

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

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

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

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

Introduction aux Machines Virtuelles avec VMKit

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

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

Programmation Orientée Objet

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

Synchro et Threads Java TM

Java 1.5 : principales nouveautés

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Web Tier : déploiement de servlets

Threads. Threads. USTL routier 1

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

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

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

Architecture Orientée Service, JSON et API REST

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

Traduction des Langages : Le Compilateur Micro Java

IFT287 Exploitation de base de données relationnelles et orientées objet. Laboratoire Mon premier programme Java en Eclipse

INITIATION AU LANGAGE JAVA

TD 1 - Transmission en bande de passe

Chapitre I Notions de base et outils de travail

Java Licence Professionnelle CISII,

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

Derrière toi Une machine virtuelle!

Premiers Pas en Programmation Objet : les Classes et les Objets

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

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

Une introduction à la technologie EJB (2/3)

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

F. Barthélemy. 17 mai 2005

Projet de programmation (IK3) : TP n 1 Correction

Chapitre 2. Classes et objets

Création d objet imbriqué sous PowerShell.

1 Définition d une classe en Java

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

2 Chapitre 1 Introduction

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

Le MSMQ. Version 1.0. Pierre-Franck Chauvet

Corrigé des exercices sur les références

Java Licence Professionnelle CISII,

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

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

Transcription:

Programmation orientée objet en langage JAVA Java RMI : Techniques et utilisations avancées de RMI Claude Duvallet Université du Havre UFR Sciences et Techniques 25 rue Philippe Lebon - BP 540 76058 LE HAVRE CEDEX Claude.Duvallet@gmail.com http://litis.univ-lehavre.fr/ duvallet/ Claude Duvallet 1/28

Techniques et utilisations avancées de RMI 1 Sécurité et chargement dynamique de code 2 3 4 5 Claude Duvallet 2/28

Rappels et cadre Security Manager Applets signées et RMI Codebase et RMI CLASSPATH et rmiregistry Sécurité et chargement dynamique de code Si le code du stub n est pas présent sur le site local, le protocole RMI prévoit le chargement dynamique du stub en utilisant un serveur web et le protocole HTTP java -Djava.rmi.server.codebase=http ://hostname/... HelloServeur Si on utilise le chargement dynamique alors le chargeur dynamique utilisé par RMI (RMIClassLoader) regarde si la classe demandée correspond au niveau de sécurité requis utilisation d un SecurityManager. il faut créer et installer le «gestionnaire de sécurité» System.setSecurityManager(new RMISecurityManager()); Claude Duvallet 3/28

Rappels et cadre Codebase : Sécurité et chargement dynamique de code Rappels et cadre Security Manager Applets signées et RMI Codebase et RMI CLASSPATH et rmiregistry Un codebase est un endroit depuis lequel charger du code dans une machine virtuelle. CLASSPATH est un codebase local, autre exemple de codebase : http://serveur/~duvallet/classes/ Le codebase d une applet est toujours relatif à l URL depuis laquelle elle a été chargée. Security Manager : Toute Jmachine virtuelle qui doit charger du code a besoin (Java 2) d un Security Manager (SM). Principe d un Security Manager : si aucun security manager n est installé, alors seules les classes accessibles depuis le CLASSPATH peuvent être chargées. un security manager vérifie différents critères sur les classes au chargement. Claude Duvallet 4/28

Security Manager Sécurité et chargement dynamique de code Rappels et cadre Security Manager Applets signées et RMI Codebase et RMI CLASSPATH et rmiregistry Un SecurityManager doit être utilisé avec RMI, sinon les clients et les serveurs RMI ne peuvent pas charger de code autre que directement par le CLASSPATH. Dans le cas d une application générale (ni NFS, ni une applet), il faut un SecurityManager dans le client et le serveur. Les clients RMI charge du code : les stub. Dans le cas d une applet : on peut se contenter d un SecurityManager(SM) dans le serveur car le client dispose déjà d un SM : celui du browser qui a chargé l applet. Claude Duvallet 5/28

Fichier de sécurité et RMI Rappels et cadre Security Manager Applets signées et RMI Codebase et RMI CLASSPATH et rmiregistry Pour obtenir les sécurités de base nécessaire à RMI, il faut écrire un fichier.java.policy grant { permission java.net.socketpermission "*:1024-65535", "connect,accept,resolv permission java.net.socketpermission "*:1-1023", "connect,resolve"; }; La deuxième partie concerne les ports réservés. Ou toutes les permissions : grant { // Permettre tout permission java.security.allpermission; }; Claude Duvallet 6/28

Applets signées et RMI Rappels et cadre Security Manager Applets signées et RMI Codebase et RMI CLASSPATH et rmiregistry Par défaut, une applet ne peut communiquer (tcp, donc RMI) qu avec le host qui l a chargée. Pour obtenir son nom : getcodebase().gethost(). Si l on veut faire une communication vers une objet RMI se trouvant sur un autre host, il faut faire une applet signée. Une applet ne peut pas non-plus par défaut communiquer par RMI avec le host qui l a chargée (celui sur lequel elle est en train de s exécuter). Claude Duvallet 7/28

Codebase et RMI Sécurité et chargement dynamique de code Rappels et cadre Security Manager Applets signées et RMI Codebase et RMI CLASSPATH et rmiregistry Avec RMI, propriété Java spéciale : java.rmi.server.codebase. Au lancement du client (mais aussi du seveur si nécessaire, voir plus loin) on va spécifier le java rmi server codebase, de sorte que l on puisse télécharger du code (byte code de classes Java) si nécessaire. Par exemple : le code d implémentation du stub. codebase est une propriété qui représente une ou plusieurs URL depuis lesquelles des classes peuvent être téléchargées. Exemple d utilisation : java -Djava.rmi.server.codebase=http://serveur/~duvallet/classes/ hello.helloimpl Claude Duvallet 8/28

Codebase et RMI Sécurité et chargement dynamique de code Rappels et cadre Security Manager Applets signées et RMI Codebase et RMI CLASSPATH et rmiregistry Ou plusieurs séparés par des blanc et entre : java -Djava.rmi.server.codebase="http://serveur1/exemple1.jar http://serveur2/exemple2.jar http://serveur3/dir/" Il faut un / si c est un répertoire et non un fichier. On peut aussi utiliser une URL vers un fichier : file:/monrepertoire/chemin. La technique n est pas utilisable uniquement pour télécharger les stub, mais également pour récupérer le code (.class) de paramètres polymorphes. Ces techniques de polymorphisme et chargement dynamique permettent de faire des infrastructures client-serveurs complètement générique. Claude Duvallet 9/28

CLASSPATH et rmiregistry Rappels et cadre Security Manager Applets signées et RMI Codebase et RMI CLASSPATH et rmiregistry Avant de lancer le rmiregistry, on doit s assurer de ne pas avoir de CLASSPATH qui permet de télécharger des classes que l on veut télécharger automatiquement vers le client. En particulier le stub pour l objet distant. Si rmiregistry peut accéder à des classes par le CLASSPATH, cela va être prioritaire sur le codebase, et un client ne pourra pas télécharger le stub, ou autres classes. Voir : java.rmi.server.codebase property Pour être absolument sûr, il est préférable de faire unset CLASSPATH avant de lancer le rmiregistry Claude Duvallet 10/28

Principe des applets Principe Code et principes des classes Compilation et déploiement Depuis une applet, on va faire un appel RMI vers un serveur qui se trouve sur le host depuis lequel on a chargé l applet. Le résultat de l appel est retourné dans le browser, et affiché par l applet. Les différentes étapes : 1 Chargement de l applet 2 Lookup dans le rmiregistry 3 Retour du stub 4 Appel à l objet distant 5 Retour du résultat Claude Duvallet 11/28

Code et principes des classes Principe Code et principes des classes Compilation et déploiement Attention à l utilisation des packages : en Java, il y a un mapping entre le nom complet du package d une classe et le chemin pour trouver cette classe. Cela permet au compilateur de trouver les classes. Dans l exemple : package hello $HOME/rmi/hello Remote Interface Hello package hello; import java.rmi.remote; import java.rmi.remoteexception; public interface Hello extends Remote{ String sayhello() throws RemoteException; } Claude Duvallet 12/28

Serveur Hello package hello; import java.rmi.*; import java.rmi.server.unicastremoteobject; Principe Code et principes des classes Compilation et déploiement public class HelloImpl extends UnicastRemoteObject implements Hello { public HelloImpl() throws RemoteException { super(); } } public String sayhello() { return "Bonjour le monde!"; } public static void main(string args[]) { // Crée et installe un Security Manager if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } try { HelloImpl obj = new HelloImpl(); // Attache l instance de l objet avec le nom "HelloServer" Naming.rebind("HelloServer", obj); System.out.println("HelloServer liée dans le rmiregistry"); } catch (Exception e) { System.out.println("HelloImpl err: " + e.getmessage()); e.printstacktrace(); } } Claude Duvallet 13/28

Applet client package hello; import java.applet.applet; import java.awt.graphics; import java.rmi.naming; import java.rmi.remoteexception; public class HelloApplet extends Applet { String message = "blanc"; } Principe Code et principes des classes Compilation et déploiement // "obj" est l identifiant de l objet distant qui implément le "Hello" Hello obj = null; public void init() { try { obj = (Hello)Naming.lookup("//" + getcodebase().gethost() + "/HelloServer"); message = obj.sayhello(); } catch (Exception e) { System.out.println("HelloApplet exception: " + e.getmessage()); e.printstacktrace(); } } public void paint(graphics g) { g.drawstring(message, 25, 50); } Claude Duvallet 14/28

Page HTML : hello.html Principe Code et principes des classes Compilation et déploiement <HTML> <TITLE>Hello World</TITLE> <BODY> <CENTER> <h1>hello World</h1> </CENTER> Le message depuis HelloServer est : <p> <applet codebase="classes/" code="hello.helloapplet" width=500 height=120> </applet> </p> </BODY> </HTML> Claude Duvallet 15/28

Compilation et déploiement (1/5) Principe Code et principes des classes Compilation et déploiement Placement des fichiers, serveur HTTP : Compilation en spécifiant où les.class doivent être placés : $HOME/public_html/classes Souvent les serveurs web permettent l accès au répertoires des utilisateurs par : http://host/~username/, et public_html et égal à www. Sinon, et dans le cas où le serveur de l applet cliente et du serveur ont accès au même système de fichiers, alors on peut utiliser une URL de type file : file:/home/login/public_html. Alternative : serveur HTTP minimal fourni par Sun : http://java.sun.com/products/jdk/rmi/class-server.zip Claude Duvallet 16/28

Compilation et déploiement (2/5) Principe Code et principes des classes Compilation et déploiement Compilation : Supposons que l on place les.class dans $HOME/public_html/classes alors on va compiler de la façon suivante : javac -d $HOME/public_html/classes hello/ Hello.java hello/helloimpl.java hello/ HelloApplet.java Cette commande : crée le répertoire hello (s il n existe pas déjà) dans le répertoire $HOME/public_html/classes. et y met les.class Il faut que le répertoire classes existe. Compile et y crée les 3 fichiers : Hello.class HelloImpl.class HelloApplet.class Puis, génération des stub et skeleton : rmic -d $HOME/public_html/classes hello.helloimpl Claude Duvallet 17/28

Compilation et déploiement (3/5) Principe Code et principes des classes Compilation et déploiement Compilation (suite) : La commande est exécutée sur la classe qui implémente des objets distants (HelloImpl) et va générer : HelloImpl_Stub.class et HelloImpl_Skel.class dans le même répertoire que les autres.class Placement de l applet et CLASSPATH Mettre le fichier HTML sous le répertoire accessible depuis le browser : mv $HOME/src/hello/hello.html $HOME/public_html/ Claude Duvallet 18/28

Compilation et déploiement (4/5) Principe Code et principes des classes Compilation et déploiement Lancer le RMI registry : Pas de CLASSPATH unset CLASSPATH rmiregistry & ou rmiregistry 2001 &. On veut que le client qui va utiliser le rmiregistry download les.class par le serveur HTTP. Si le rmiregistry trouve dans son CLASSPATH les.class, alors il va ignorer la propriété codebase du serveur qui lui indique comment trouver les classes, et le client ne marchera pas. Claude Duvallet 19/28

Compilation et déploiement (5/5) Principe Code et principes des classes Compilation et déploiement Lancer le serveur : Pour lancer le serveur (HelloImpl), il faut que le répertoire $HOME/public_html/classes soit dans le CLASSPATH. C est la propriété Java (java.rmi.server.codebase) qui va permettre de spécifier comment transmettre le stub du host du serveur vers le client Tout d abord du serveur vers le rmiregistry : Lorsque le rmiregistry a besoin du stub, il ne le trouve pas en local, car PATH à vide, il va donc chercher dans le codebase fourni par le serveur http. Cette source de chargement est mémorisée dans l objet, plus tard le client utilisera le même moyen pour charger le.class du stub reçu. java -Djava.rmi.server.codebase=http://serveur/ duvallet/ classes/ -Djava.security.policy=$HOME/src/policy hello.helloimpl Claude Duvallet 20/28

Principe et implications Retour de résultat Passage de paramètres Mécanisme puissant pour la programmation répartie. Permet de faire, par exemple, du client-serveur générique, ou encore de gérer l évolution des logiciels sans avoir besoin d arrêter des systèmes complexes. Claude Duvallet 21/28

Principe et implications Principe et implications Retour de résultat Passage de paramètres On envoie à distance un sous-type du type attendu. = Technique classique du polymorphisme. Ici, en plus, on gère dynamiquement le fait que l objet que l on envoie n est pas forcément connu dans le processus distant où il arrive : l objet n est pas connu, on ne dispose pas du byte code de sa classe. Comme pour les stub de l exemple précédent, il va falloir faire du chargement dynamique de code d une machine virtuelle à l autre. Claude Duvallet 22/28

Retour de résultat Sécurité et chargement dynamique de code Principe et implications Retour de résultat Passage de paramètres Du Serveur vers le client : Le client appelle une routine du type : Resultat1 res = serveur.meth (...). Le serveur retourne un objet de type Resultat2 qui dérive de Resultat1. Le client devra charger le code de Resultat2 afin de pouvoir se servir (appeler les routines, avoir accès aux attributs) de l objet reçu en résultat de son appel distant. Note : Le client devra également charger toutes les classes (ou interfaces) utilisées par Resultat2 : ses attributs, les paramètres de ses routines, etc. Claude Duvallet 23/28

Passage de paramètres Principe et implications Retour de résultat Passage de paramètres Du Client vers le Serveur Le client appelle une routine du type : Resultat1 res = serveur.meth (ParamA1, ParamB1) mais ne passe pas en paramètres des objets de type ParamA1, ParamB1, mais de type ParamA2, ParamB2 qui sont des classes qui en dérivent. Le serveur devra charger le code de ParamA2, ParamB2 afin de pouvoir se servir (appeler les routines, avoir accès aux attributs) des objets reçu en paramètre pour exécuter l appel de "meth". Remarque : Le serveur devra également charger toutes les classes (ou interfaces) utilisées par ses deux nouvelles classes : ses attributs, les paramètres de ses routines, etc. Claude Duvallet 24/28

Modèle Sécurité et chargement dynamique de code Modèle Appels asynchrones Callback Que se passe-t-il si N clients font des appels RMI sur un serveur? Ce n est pas précisé dans la sémantique de RMI Au moins un thread, mais implicite. On ne sait pas si l on va avoir plusieurs threads, ou si les appels sont sérialisés. S il y a un seul thread, il y a forcément une mise en attente si plusieurs appels arrivent de façon proche. Mais on ne sait pas vraiment dans quel ordre ils seront exécutés : FIFO : le plus simple et le plus logique. Un pool de threads. On peut faire des implémentations de RMI qui créent un thread à chaque appel. Claude Duvallet 25/28

Appels asynchrones Modèle Appels asynchrones Callback Comment faire un appel asynchrone avec RMI? Gérer l asynchronisme explicitement avec un thread Dans le cas le plus simple (une routine qui retourne void), il n y a pas grand chose de plus à faire. Le thread est utilisé simplement pour ne pas bloquer l appelant. Si on veut faire un appel asynchrone avec une routine qui ne retourne pas void : Il faut également un emplacement spécial (futur) pour mettre le résultat Il faudra également avoir une technique pour tester si le résultat est revenu (ou notifier le thread qui pourrait attendre le résultat) Il faudra aussi une technique de synchronisation pour faire attendre l appelant si on le souhaite. Soit on garde un thread bloquée chez l appelant, Soit on fait un Call Back depuis l appelé. Claude Duvallet 26/28

Callback Comment faire un Call back avec RMI? Modèle Appels asynchrones Callback Très utile, par exemple pour informer un client qu une valeur à changée dans un serveur. Éviter de faire du "pooling" : faire sans cesse des appels au serveur pour voir si la valeur à changée. Pas de moyen simple est direct, il faut avoir un objet distant (Remote) du côté du client également afin de faire un appel RMI du serveur vers le client! Pattern au niveau des objets : Callback sur le client lui-même : l objet client est lui même un objet distant et il doit se protéger des call backs (synchronize). un autre objet de la machine virtuelle du client est un objet distant et il y a une référence mutuelle entre celui-ci et le client. Attention à au moins deux choses : accès concurrent, possibilités de deadlock lors des callbacks. Claude Duvallet 27/28

Le DGC (Distributed Garbage Collector) interagit avec les GC locaux et utilise un mécanisme de reference-counting. Lorsqu un OD est passé en paramètre à un autre OD ref_count++. Lorsqu un stub n est plus référencé weak reference. Lorsque le GC du client libère le stub, sa méthode finalize est appelée et informe le DGC ref_count--. Lorsque le nombre de références d un OD = 0 weak reference. Le GC du serveur peut alors libérer l OD. Le client doit régulierement renouveler son bail auprès du DGC. Si référence à un OD libérée RemoteException. Claude Duvallet 28/28