Plan de l - PowerPoint PPT Presentation

1 / 61
About This Presentation
Title:

Plan de l

Description:

Title: Java Remote Method Invocation Author: Remi Vankeisbelck Last modified by: Anne-Marie Dery-Pinna Created Date: 9/27/2001 6:04:24 PM Document presentation format – PowerPoint PPT presentation

Number of Views:55
Avg rating:3.0/5.0
Slides: 62
Provided by: RemiV2
Category:
Tags: java | plan

less

Transcript and Presenter's Notes

Title: Plan de l


1
Plan de lenseignement
  • Cours Introduction au réseau via les objets
    distants (Application à RMI)
  • Ce que cache RMI programmation socket mode
    connecté
  • Mode déconnecté
  • Communication multicast
  • Retour sur RMi module applications réparties
  • Retour sur les sockets module Internet et
    Réseaux
  • Première expérimentation réseau utilisation de
    RMI
  • Socket Java TCP
  • Socket Java TCP
  • Socket Java TCP
  • Finaliser
  • Sockets C

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

Concepts généraux
Mise en œuvre Java
3
Client Serveur
4
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 ?

5
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

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

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

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

9
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

10
Invocation de méthodes distantes
11
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

12
Stubs et encodage des paramètres
13
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...

14
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

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

16
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

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

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

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

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

24
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

25
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

26
Classe d implémentation
HelloWorld
HelloWorld
HelloWorldImpl
27
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

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

29
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

30
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

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

32
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

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

34
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

35
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

36
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

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

38
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

39
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

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

41
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

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

43
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

44
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

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

46
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

47
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

48
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

49
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

50
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

51
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"

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

53
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

54
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

55
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

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

57
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

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

59
Erreurs classiques
  • Stub inaccessible au rmiregistry
  • java.rmi.ServerException RemoteExceptionoccurred
    in server ...java.rmi.UnmarshalException
    errorunmarshalling ...java.lang.ClassNotFoundExc
    eptionLe stub est accessible au serveur MAIS
    PAS AU rmiregistryAttention à lordre dappel
    génération des stubs et appel du rmiregistry
  • rmiregistry pas lancé
  •   java.net.ConnectException
  • Oubli du constructeur pour le RemoteObject
    unreported exception java.rmi.RemoteException in
    default constructorpublic class HelloImpl extends
    UnicastRemoteObject implements Hello       
  • rmiregistry déjà lancé
  • java.rmi.server.ExportException Port already in
    use 1099On peut lancer un autre registry mais
    sur un autre port.

60
Erreurs classiques
  • La classe dimplémentation n'hérite pas de
    UnicastRemoteObject
  • S'il n'hérite pas de UnicastRemoteObject, il
    n'est pas Remote donc on ludemande d'être
    Serializable ...Trouble java.rmi.MarshalExceptio
    n error marshalling arguments nested exception
    is         java.io.NotSerializableException
    CalculatorImpl
  • ATTENTION aux CLASSPATH et package Java

61
Une autre utilisation du rmiRegistry
  • import java.rmi.registry.LocateRegistry
  • import java.rmi.registry.Registry
  • Client
  • Registry registry
  • registry LocateRegistry.getRegistry()
  • Hello hello (Hello) registry.lookup("couco
    u")
  • Serveur
  • LocateRegistry.createRegistry(port) //
    port1099
  • Hello stub (Hello) UnicastRemoteObject.exportOb
    ject(unHello, 0)
  • Naming.rebind("rmi//""localhost""" port
    "/coucou", stub)
Write a Comment
User Comments (0)
About PowerShow.com