Invocation de M - PowerPoint PPT Presentation

1 / 73
About This Presentation
Title:

Invocation de M

Description:

Invocation de M thode distance Exemple : Java Remote Method Invocation travailler seuls ESSI AM Dery Merci R mi Vankeisbelck, Michel Riveill etc – PowerPoint PPT presentation

Number of Views:70
Avg rating:3.0/5.0
Slides: 74
Provided by: RemiV6
Category:

less

Transcript and Presenter's Notes

Title: Invocation de M


1
Invocation de Méthode à distance Exemple
JavaRemote Method Invocation
À travailler seuls
  • ESSI
  • AM Dery
  • Merci à Rémi Vankeisbelck, Michel Riveill etc

Concepts généraux
Mise en œuvre Java
2
Plan du cours
  • Introduction de la programmation objet à l OD
  • Invocation de méthodes distantes
  • Description
  • Stubs et encodage des paramètres
  • Etablissement d une invocation de méthode
    distante
  • Interfaces et implémentations
  • Localiser des objets distants
  • Conception, implémentation et exécution de
    l'exemple
  • Charger des classes dynamiquement
  • Conclusion intermédiaire

3
Maturation de la technologie orientée objet
4
Objets Messages
Application Collection d objets interagissant
  • module logiciel
  • indépendance de la programmation et de la
    construction
  • unité autonome
  • Méthode comportement des objets
  • Message interaction entre objets de
    lapplication

5
Classes et héritage
Mécanisme dabstraction Généralisation Surcharge
des méthodes par héritage
6
Classe et Composition
VEHICULE
CARROSSERIE
MOTEUR
7
Objets briques logicielles
  • Assembler des briques élémentaires
  • Réduire la complexité des systèmes dinformation

Séparation entre interface et implémentation Repr
ésentation et types de données Mécanismes
dabstraction
8
Séparation entre interface et implémentation
  • séparation de la définition et de
    limplémentation encapsulation
  • interface partie visible de lobjet
  • implémentation partie privée inaccessible
    depuis dautres objets
  • interface contrat entre lobjet et le monde
    extérieur

9
Séparation entre interface et implémentation
  • Assemblage des objets dépend uniquement des
    interfaces, le changement local dun objet ne
    perturbe pas lensemble de lapplication.

Importance de la nomenclature des
objets substitution logique liée à la
substitution physique
10
Représentation et Types de données
  • Définition de nouveaux types
  • Choix dun 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
11
Mécanismes dabstraction
  • Abstraction des données essence du procédé de
    construction de systèmes d information à base
    d objets distribués
  • par Classe et/ou Composition

Des mises en œuvre différentes selon les cas
12
Maturation des communications Client Serveur
  • Des programmes (fonctionnant sur des machines
    différentes) qui communiquent au travers du
    réseau.
  • Un programme Client envoie des requêtes à un
    programme serveur (qui prend en charge
    limplémentation)

13
Infrastructure Client Serveur
CLIENT
SERVEUR
requêtes
14
Client Serveur
15
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 quils puissent s envoyer
    directement des messages ?

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

17
Infrastructure Objets Distribués
Objet2
Objet3
Objet1
Client
Client Serveur
Serveur
18
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)

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

20
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 !!!

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

22
Invocation de méthodes distantes
23
Stubs et encodage des paramètres
  • le code dun objet client invoque une méthode sur
    un objet distant
  • Utilisation dun objet substitut dans la JVM du
    client le stub (souche) de l objet serveur

24
Stubs et encodage des paramètres
25
Du côté du client
  • Appel dune méthode du stub (de façon entièrement
    transparente)
  • le stub construit un bloc de données avec
  • identificateur de lobjet 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...

26
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

27
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 ...

28
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

29
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()

30
Un exemple le sempiternel  Hello World  !!!
31
Interfaces et classes prédéfinies
32
Interface protocole d application
  • L interface HelloWorld
  • import java.rmi.
  • interface HelloWorld extends Remote
  • public String sayHello()
  • throws RemoteException

33
Rôle de l interface
HelloWorld
HelloWorld
34
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
  • ...

35
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)

36
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

37
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

38
Classe d implémentation
HelloWorld
HelloWorld
HelloWorldImpl
39
L outil RMIC
  • outil livré avec le JDK permet de générer les
    stubs
  • gt 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

40
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 ???

41
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

42
Les Services de Nommage
  • Obtention d'une première référence sur un objet
    distant  bootstrap  à laide dun 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

43
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é

44
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

45
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(...)

46
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

47
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

48
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

49
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...

50
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 lapplication
    serveur RMI
  • 6) créer, compiler et lancer un programme client
    accédant à des OD du serveur

51
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

52
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()

53
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) !!!
  • gt rmiregistry
  • et ensuite on lance le serveur
  • gt java HelloWorldServer
  • Création de l'objet serveur...
  • Référencement dans le RMIRegistry...
  • Attente d'invocations - CTRL-C pour stopper

54
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/Hell
    oWorld") 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()

55
Le client (suite)
  • Il suffit ensuite de lancer le programme
  • gt 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

56
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

57
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é

58
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

59
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

60
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

61
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)
  • HelloWorldImpl_Stub.class
  • Client (fichiers nécessaires au démarrage du
    client)
  • HelloWorld.class
  • HelloWorldClient.class

62
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

63
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"
  • permission java.net.SocketPermission
  • "80", "connect"

64
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/Hell
    oWorld") 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()

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

66
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
  • gt java -Djava.security.policyclient.policy
  • -Djava.rmi.server.codebasehttp//www.class-serve
    r.com80/
  • HelloWorldClient

67
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

68
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 !!!

69
Conclusion intermédiaire
  • 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

70
Appel de Procédure à Distance
CLIENT
SERVEUR
F(1,  x)
F(1,x)
unmarshalling
marshalling
10
marshalling
unmarshalling
71
Langages de spécifications
  • Spécifications des types de données qui
    transitent sur le réseau

Protocole CHOICE
requete 0 REQUETE,
reponse 1 REPONSE
ASN.1 et norme ISO
Programme protocol version REPONSE
rerep(REQUETE) 1 1 10000
  • XDR et RPC de SUN

72
Générateurs de Stubs
Spécifications des données
XDR
ASN1
Générateurs
RPCGEN / MAVROS
Fichiers générés
Librairie marshalling et unmarshalling squelettes
du client et du serveur
Types de données C Lisp Java
Types de données C
73
Quelques bouquins...
  • Core Java Volume 2
  • Par Cay S. Horstmann Gary Cornell
  • Editions CampusPress
  • Une référence pour les développeurs Java
  • Bonne section sur RMI, servi de base pour ce
    cours
  • Java Distributed Computing
  • Par Jim Farley
  • Editions O'Reilly
  • Tout sur les applications reparties avec Java
  • Plus technique...
Write a Comment
User Comments (0)
About PowerShow.com