1 plan de lenseignement cours introduction au réseau via les objets distants (application à rmi)...

61
1 Plan de l’enseignement 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

Upload: paul-bourgeois

Post on 03-Apr-2015

107 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

1

Plan de l’enseignement

• 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

Page 2: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

Invocation de Méthode à distance Exemple : Java

Remote Method Invocation

Département SI

AM Dery

Merci à Rémi Vankeisbelck, Michel Riveill etc

À travailler seuls

Concepts généraux

Mise en œuvre Java

Page 3: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

3

Client Serveur

Page 4: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

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 qu’ils puissent s ’envoyer directement des messages ?

Page 5: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

5

Objets distribués

• Un programme (objet) peut être à la fois client de certains serveurs et serveur d’autres clients

• Il peut y avoir reconfiguration dynamique des rôles Client Serveur

Page 6: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

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)

Page 7: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

7

Invocation de méthodes distantes

• Semble simple en théorie...

• ... un peu plus complexe en réalité !!!

Page 8: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

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

Page 9: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

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

Page 10: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

10

Invocation de méthodes distantes

Page 11: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

11

Stubs et encodage des paramètres

• le code d’un objet client invoque une méthode sur un objet distant– Utilisation d’un objet substitut dans la JVM

du client : le stub (souche) de l ’objet serveur

Page 12: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

12

Stubs et encodage des paramètres

Page 13: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

13

Du côté du client

• Appel d’une méthode du stub (de façon entièrement transparente)

• le stub construit un bloc de données avec– identificateur de l’objet 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...

Page 14: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

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

Page 15: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

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

Page 16: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

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

Page 17: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

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

Page 18: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

18

Un exemple : le sempiternel « Hello World » !!!

Page 19: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

19

Interfaces et classes prédéfinies

Page 20: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

20

• L ’interface HelloWorldimport java.rmi.*;interface HelloWorld extends Remote {public String sayHello()

throws RemoteException;}

Interface = protocole d ’application

Page 21: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

21

Rôle de l ’interface

HelloWorldHelloWorld

Page 22: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

22

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

Les exceptions

Page 23: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

23

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

Du côté client

Page 24: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

24

• 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;

}

}

Du côté Serveur

Page 25: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

25

• 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

Classe d ’implémentation

Page 26: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

26

Classe d ’implémentation

HelloWorldHelloWorld

HelloWorldImpl

Page 27: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

27

• outil livré avec le JDK permet de générer les stubs

> 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

L ’outil RMIC

Page 28: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

28

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

Référence sur un objet

Page 29: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

29

– 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

Localisation des objets de serveur

Page 30: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

30

• Obtention d'une première référence sur un objet distant : « bootstrap » à l’aide d’un 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

Les Services de Nommage

Page 31: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

31

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

Exemple : Le RMIRegistry

Page 32: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

32

– 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

Le RMIRegistry

Page 33: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

33

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

La classe Naming

Page 34: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

34

• L ’objet serveur HelloWorld (coté serveur bien entendu…)– On a créé l'objet serveur et on a une variable qui le

référenceHelloWorld hello = new HelloWorldImpl();

– On va enregistrer l'objet dans le RMIRegistryNaming.rebind("HelloWorld",hello);

– L'objet est désormais accessible par les clients

Enregistrement d ’une référence

Page 35: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

35

• 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

Obtention d'une référence coté client

Page 36: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

36

– 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

Remarque

Page 37: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

37

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

Conception, implémentation et exécution de l'exemple

Page 38: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

38

• 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 l’application

serveur RMI• 6) créer, compiler et lancer un programme client

accédant à des OD du serveur

Processus de développement

Page 39: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

39

– 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

Hello World : L'objet distant

Page 40: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

40

– 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();

}}

}

Hello World : Le serveur

Page 41: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

41

– 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) !!!

> rmiregistry &

– et ensuite on lance le serveur

> java HelloWorldServer

Création de l'objet serveur...Référencement dans le RMIRegistry...Attente d'invocations - CTRL-C pour stopper

Serveur (suite)

Page 42: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

42

• 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 standardimport 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/HelloWorld");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();

}}

}

Hello World : client

Page 43: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

43

– Il suffit ensuite de lancer le programme

> 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

Le client (suite)

Page 44: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

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

Page 45: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

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é

Page 46: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

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

Page 47: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

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

Page 48: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

48

• 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

Chargement dynamique

Page 49: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

49

• 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

Hello World : chargement dynamique

Page 50: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

50

• 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

};

Hello World : Démarrage du serveur

Web

Page 51: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

51

– 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.policygrant {

permission java.net.SocketPermission"*:1024-65535", "connect,resolve";

permission java.net.SocketPermission"*:80", "connect";

};

Hello World : Politiques de sécurité

Page 52: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

52

• Le client intègre un gestionnaire de sécurité RMI pour les stubs téléchargés dynamiquementimport java.rmi.*;import java.rmi.server.*;

public class HelloWorldClient {

public static void main(String[] args) {try {

// Installe un gestionnaire de sécurité RMISystem.setSecurityManager(new RMISecurityManager());System.out.println("Recherche de l'objet serveur...");HelloWorld hello = (HelloWorld)Naming.lookup("rmi://server/HelloWorld");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();

}}

}

Hello World : gestionnaire de sécurité RMI

Page 53: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

53

– 1) Lancer la base de registres RMI (elle doit pouvoir accéder aux classes Download - CLASSPATH)> rmiregistry

– 2) Lancer le serveur Web servant les fichiers de classes Download

– 3) Lancer le serveur (les classes Server doivent être accessibles)> java HelloWorldServer

Création de l'objet serveur...Référencement dans le RMIRegistry...Attente d'invocations - CTRL-C pour stopper

Hello World : Démarrage coté serveur

Page 54: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

54

– 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

> java -Djava.security.policy=client.policy -Djava.rmi.server.codebase=http://www.class-server.com:80/ HelloWorldClient

Hello World : Démarrage coté client

Page 55: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

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

Page 56: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

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

!!!

Page 57: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

57

• 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

Conclusion intermédiaire

Page 58: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

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

Page 59: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

Erreurs classiques

Stub inaccessible au rmiregistry • java.rmi.ServerException: RemoteException

occurred in server ...java.rmi.UnmarshalException: errorunmarshalling ...java.lang.ClassNotFoundException:

Le stub est accessible au serveur MAIS PAS AU rmiregistryAttention à l’ordre d’appel : 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.

Page 60: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

Erreurs classiques

• La classe d’implé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.MarshalException: error marshalling arguments; nested exception is:         java.io.NotSerializableException: CalculatorImpl

ATTENTION aux CLASSPATH et package Java

Page 61: 1 Plan de lenseignement Cours Introduction au réseau via les objets distants (Application à RMI) Ce que cache RMI : programmation socket – mode connecté

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("coucou");

Serveur

LocateRegistry.createRegistry(port); // port=1099

Hello stub = (Hello) UnicastRemoteObject.exportObject(unHello, 0);

Naming.rebind("rmi://"+"localhost"+":"+ port +"/coucou", stub);

61