[nom] à [nom]
Pourquoi ?
Maturation de la technologie orientée objet
[nom]
Smalltalk , C++, Java
Maturation [nom] communications Client-Serveur
[nom]
RPC
couches OSI
L’héritage de la programmation Client Serveur
Importance du marshalling
[nom] serveurs accessibles simultanément par plusieurs clients
Enregistrement [nom] serveurs dans [nom] annuaires de noms
Communication connectée ou par message…..
Appel de procédures à distance
Circulation de messages et machines hétérogènes
Infrastructure informatique de distribution
Couche de services · Couche de transport
Annuaires · TCP
Sécurité · UDP
Protocole d’applications
Exemple
CLIENT EPUNSAfun · SERVEUR de Surnoms
oter
infrastructure
Protocole d’application ?
Communication client serveur
CLIENT
Connexion au serveur
Préparation de la requête
Envoi de la requête
Attente du résultat
….
Analyse du résultat reçu
SERVEUR
Attente de requêtes
Analyse de la requête
…..
Exécution
….
Préparation de la réponse
Envoi de la réponse
Exemple : annuaire [nom] surnoms
1:Paul:bug ou ENR/nPaul/n/bug/n ou Objet Requête Seriablizable
EssiFun · SERVEUR de Surnoms
enregistrer(« paul », « bug »)
marshalling [téléphone].. · unmarshalling
enregistrer(« paul », « bug ») = TRUE
unmarshalling · marshalling
101..
TRUE
Différence entre un transport TCP et UDP pour le codage [nom] données ?
L’héritage de la programmation par objets
Communication par envoi de messages
Encapsulation et Interface
Héritage et Composition
Objets = briques logicielles
Assembler [nom] briques élémentaires
Réduire la complexité [nom] systèmes d’information
Séparation entre interface et implémentation
Représentation et types de données
Mécanismes d’abstraction
Séparation entre interface et implémentation
séparation de la définition et de l’implémentation :
encapsulation
interface : partie visible de l’objet implémentation : partie privée inaccessible depuis d’autres objets interface = contrat entre l’objet et le monde extérieur
Séparation entre interface et implémentation
Assemblage [nom] objets dépend uniquement [nom]
interfaces, le changement local d’un objet ne perturbe pas l’ensemble de l’application.
Importance de la nomenclature [nom] objets substitution logique liée à la substitution physique
Représentation et Types de données
Définition de nouveaux types
Choix d’un type pour une donnée (ex. montant) devient une contrainte sur la conception.
Types de données Abstraits
considérés comme [nom] types de base
Mécanismes d’abstraction
Abstraction [nom] données : essence du procédé de construction de systèmes d ’information à base d ’objets distribués par Héritage et/ou Composition
[nom] mises en œuvre différentes selon les cas
Que peut on automatiser ?
A partir du protocole d’applications
Au minimum, la phase de marshalling/unmarshalling
(hétérogéneité [nom] langages, [nom] systèmes, etc)
Selon les cas, le squelette du serveur les appels distants du client
Interaction Client/server :
socket TCP
Serveur
create socket, port=x, for incoming request:
welcomeSocket =
ServerSocket()
TCP
wait for incoming connection request connection setup connectionSocket = welcomeSocket.accept()
read request from connectionSocket
write reply to connectionSocket
close
connectionSocket
Client
create socket, connect to hostid, port=x clientSocket =
Socket()
send request using clientSocket
read reply from clientSocket
close
clientSocket
Client/server socket interaction: UDP
Serveur
create socket, port=x, for incoming request:
serverSocket =
DatagramSocket()
read request from serverSocket
write reply to
[nom] client
host address, port umber
Client
create socket, clientSocket =
DatagramSocket()
Create, address (hostid, port=x, send datagram request using clientSocket
read reply from clientSocket
close
clientSocket
Exemple : annuaire [nom] surnoms
boolean enregistrer(Personne p, Surnom sn)
ListOfPersonne lister()
boolean oter(Surnom surnom) · listePersonnes
Enregistrer(AnneMarie,AM)
lister()
Serveur
Client
Exemple : annuaire [nom] surnoms
interface : partie visible de l’objet (enregistrer, oter, lister, …) = méthodes publiques Java implémentation : partie privée inaccessible depuis d’autres objets (listePersonnes : un vecteur de Personne ou un tableau ou ….)
Interface distante = contrat entre l’objet et le monde extérieur (save impossible par exemple)
Circulation de messages et machines hétérogènes
Infrastructure informatique de distribution
Couche de services
Objets de l’application qui résultent de la conception du modèle
Couche de transport
Responsable de l’administration [nom]
objets et de l’acheminement [nom]
messages
Infrastructure ?
CLIENT · SERVEUR
transaction sécurité nommage
Service (marshalling..)
Transport TCP IP...
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 [nom] rôles
Client Serveur
Infrastructure Objets Distribués
Objet2 · Objet3
Objet1
Client · Client Serveur · Serveur
Spécifications
Générateurs
[nom] données Protocole d’application
Générateurs
Fichiers
générés
IDL · Int. Java
RMIC / Orbix...
Stubs Skeletons Proxy
(sérialisation et désérialisation…)
[nom]
public interface Surnoms extends java.[nom].Remote
{
public Boolean enregistrer(String nom, String surnom) throws java.[nom].RemoteException, ServeurSurnoms.surnoms.ExisteDeja ;
….
}
[nom]
Classes et Interfaces
Machine locale
InterfaceDistante
Souche
Appel méthode m()
ClasseLocale
Remote
Machine distante
InterfaceDistante
Squelette
Appel méthode m()
ClasseDistante
Comment activer [nom] objets distribués ?
Messages échangés entre objets =
Requêtes ou Résultats
Certains envois de messages n’attendent pas de résultats
Requête = Destinataire + nom de méthode +
Paramètres
Résultat = Donnée ou indication d’une erreur ou d’une défaillance
Comment activer [nom] objets distribués ?
Mécanisme d’exécution ou de transport définit comment les messages sont véhiculés de l’objet client vers l’objet serveur (destinataire) retrouver et activer les objets adéquats
Un objet client a deux manières d’envoyer [nom]
messages
invocation statique
invocation dynamique
Invocation statique
Le nom de l’objet destinataire et le message sont connus au moment du développement
Ne permet ni l’ajout ni le retrait d’objets dans les serveurs
Invocation dynamique
Permet au programme client de découvrir les objets à l’exécution et les interfaces proposés par ces objets construire dynamiquement messages et requêtes envoyer et recevoir le résultat de telles requêtes
Rend les systèmes réactifs et faciles à modifier
Invocation dynamique
+ surcharge
flexibilité du code
briques logicielles avec les mêmes messages pour [nom]
objets de différentes natures définir de nouveaux objets sans modifier l’interface changements qui n’affectent pas les clients
Rôle du client
Invoquer les services dont il a besoin par envoi de requêtes
ID
Accès à l’objet destinataire par une référence à son implémentation par l ’interface
Unités autonomes - solidité - robustesse - adaptation
Rôle de l’infrastructure
administre les implémentations, la création et la destruction d’objets réceptionne les requêtes, localise le serveur, vérifie son état et celui du destinataire active au besoin le serveur, lui envoie les données de la requête ramène les résultats au client doit être informée de l’arrêt d’un serveur doit gérer la persistance
Rôle du serveur
Administrer un flot de requêtes pour un ou plusieurs objets dont il a la responsabilité
Ordonnancer la séquence [nom] opérations de réponses à une requête
Rôle du serveur d’objets
active si besoin l’objet destinataire recherche et exécute la méthode passe le résultat à l’infrastructure plusieurs requêtes peuvent arriver simultanément arrêt du serveur : désactiver tous les objets et enregistrer leur état
Enregistrer un objet
- Opération pour publier un Objet
- en général, opération réalisée par le serveur
- Scénario Type
- Créer un objet
- Construire un chemin d ’accès (Name)
- Appeler l ’opération « bind » ou « rebind » avec le chemin et la référence de l ’objet void bind (in Name n, in Object obj) raises (NotFound, CannotProceed, InvalidName, AlreadyBound);
Retrouver un objet
Opération réalisée par un client ou un serveur
Scénario type :
construire un chemin d ’accès (Name) appeler l ’opération « resolve » avec le chemin convertir la référence obtenue dans le bon type
Object resolve (in Name n) raises (NotFound, CannotProceed, InvalidName)
Invocation de Méthode à distance
Exemple : Java
Remote Method Invocation
À travailler seuls · DÉPARTEMENT SI
AM DERY
Concepts généraux
Mise en œuvre Java
Merci à Rémi Vankeisbelck, Michel Riveill etc
Client Serveur
38
Objets distribués
39
Comment trouver une solution ?
Programmation OO = envoi de requêtes entre plusieurs objets
Ne peut-on pas placer [nom] objets sur différents ordinateurs de sorte qu’ils puissent s ’envoyer directement [nom] messages ?
Objets distribués
40
Un programme (objet) peut être à la fois client de certains serveurs et serveur d’autres clients
Il peut y avoir reconfiguration dynamique [nom] rôles
Client Serveur
Invocation de méthodes distantes
41
Mécanisme qui permet à [nom] objets localisés sur [nom]
machines distantes de s’échanger [nom] messages
(invoquer [nom] méthodes)
Invocation de méthodes distantes
42
Semble simple en théorie...
... un peu plus complexe en réalité !!!
[nom]
43
Heureusement, on utilise Java ;-)
Java Remote Method Invocation est la solution à notre problème
[nom] permet à [nom] objets Java d ’invoquer [nom] méthodes sur
[nom] objets localisés dans [nom] JVM différentes, et même distantes sur le réseau, et ceci de façon quasi transparente !!!
[nom]
44
Core API (intégré au JDK 1.1)
Gratuit
100 % Java
Développé par JavaSoft
Réservé aux objets Java
Utilise les [nom] et le protocole JRMP
Invocation de méthodes distantes
45
Stubs et encodage [nom] paramètres
46
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
Stubs et encodage [nom] paramètres
47
Du côté du client
48
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...
Du côté du serveur
49
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
Encodage [nom] paramètres
50
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 [nom] règles établies
Big Endian pour les entiers...
Objets ...
Générateur de stubs
51
Les stubs gèrent la communication ainsi que l'encodage [nom] paramètres
Processus évidemment complexe...
Entièrement automatique
Un outil permet de générer les stubs pour les OD
Stubs et rmic
52
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()
Un exemple : le sempiternel « Hello World » !!!
53
Interfaces et classes prédéfinies
54
Interface = protocole d ’application
55
L ’interface HelloWorld import java.[nom].*;
interface HelloWorld extends Remote { public String sayHello() throws RemoteException;
}
Rôle de l ’interface
56
HelloWorld · HelloWorld
Les exceptions
57
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
...
Du côté client
58
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é Serveur
59
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;
}
}
Classe d ’implémentation
60
doit implanter l ’interface HelloWorld doit étendre la classe RemoteServer du paquetage java.[nom]
RemoteServer est une classe abstraite
UnicastRemoteObject est une classe concrète qui gére la communication et les stubs
Classe d ’implémentation
61
HelloWorld · HelloWorld
HelloWorldImpl
L ’outil RMIC
62
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 [nom] OD afin d'en générer les stubs
Référence sur un objet
63
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 ???
Localisation [nom] objets de serveur
64
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
Les Services de Nommage
65
Obtention d'une première référence sur un objet distant : « bootstrap » à l’aide d’un Service de Nommage ou Annuaire
Enregistrement [nom] références d'objets dans l'annuaire afin que [nom] programmes distants puissent les récupérer
Exemple : Le RMIRegistry
66
Implémentation d'un service de nommage
Fourni en standard avec [nom]
Permet d'enregistrer [nom] références sur [nom] objets de serveur afin que [nom] 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é
Le RMIRegistry
67
Programme exécutable fourni pour toutes les plates formes
S'exécute sur un port (1099 par défaut) sur la machine serveur
Pour [nom] raisons de sécurité, seuls les objets résidant sur la même machine sont autorisés à lier/délier [nom] références
Un service de nommage est lui-même localisé à l'aide d'une URL
La classe Naming
68
du package java.[nom]
permet de manipuler le RMIRegistry supporte [nom] méthodes statiques permettant de Lier [nom] références d'objets serveur
Naming.bind(...) et Naming.rebind(...)
Délier [nom] 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(...)
Enregistrement d ’une référence
69
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
Obtention d'une référence coté client
70
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("[nom]://[lien]
.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
Remarque
71
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é [nom] clés
La règle de bonne utilisation du Naming est de lier [nom]
objets qui font office de point d'entrée, et qui permettent de manipuler les autres objets serveurs
Conception, implémentation et exécution de l'exemple
72
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...
Processus de développement
73
- définir une interface Java pour un OD
- créer et compiler une classe implémentant cette interface
- créer et compiler une application serveur [nom]
- créer les classes Stub (rmic)
- démarrer rmiregistry et lancer l’application serveur [nom]
- créer, compiler et lancer un programme client accédant à [nom] OD du serveur
Hello World : L'objet distant
74
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 : Le serveur
75
instancie un objet de type HelloWorld et attache au service de nommage puis objet mis en attente [nom] invocations jusqu'à ce que le serveur soit arrêté
import java.[nom].*;
import java.[nom].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();
}
}
}
Serveur (suite)
76
Apres avoir compilé le tout...
Pour démarrer le serveur, il faut tout d'abord lancer le RMIRegistry
Attention : La base de registres [nom] doit connaître les interfaces et les stubs [nom] 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
Hello World : client
77
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.[nom].*;
public class HelloWorldClient {
public static void main(String[] args) { try {
System.out.println("Recherche de l'objet serveur...");
HelloWorld hello =
(HelloWorld)Naming.lookup("[nom]://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();
}
}
}
Le client (suite)
78
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
Que doit connaître le client ?
79
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
Que doit connaître le client ?
80
les classes [nom] paramètres, [nom] valeurs de retour et
[nom] 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é
Que doit connaître le client ?
81
Le client doit disposer [nom] classes de stub, classes
[nom] 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 [nom] peuvent charger automatiquement [nom] 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
Chargement dynamique [nom] classes
82
Problème de sécurité
Le programme client télécharge du code sur le réseau
Ce code pourrait contenir [nom] virus ou effectuer [nom] opérations non attendues !!!
Utilisation d ’un gestionnaire de sécurité pour les applications de clients [nom]
Possibilité de créer [nom] gestionnaires de sécurité personnalisés pour [nom] applications spécifiques
[nom] fournit [nom] gestionnaires de sécurité suffisants pour un usage classique
Chargement dynamique
83
Pour ne plus déployer les classes du serveur chez le client
Utilisation [nom] chargeurs de classes qui téléchargent [nom] 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
Hello World : chargement dynamique
84
Séparation [nom] 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 : Démarrage du serveur Web
85
Mettre les classes Download dans le répertoire [nom]
documents Web du serveur Web, accessibles via une URL
le chargeur de classes ira chercher les classes à un emplacement de type [lien]
};
Hello World : Politiques de sécurité
86
Le programme Java client doit pouvoir se connecter aux ports de la base de registres [nom] et [nom] implémentations [nom] objets de serveur, ainsi qu'au port du serveur Web
Fichier client.policy
grant {
permission [lien].SocketPermission
"*:[téléphone]", "connect,resolve";
permission [lien].SocketPermission
"*:80", "connect";
};
Hello World : gestionnaire de sécurité [nom]
87
Le client intègre un gestionnaire de sécurité [nom] pour les stubs téléchargés dynamiquement
import java.[nom].*;
import java.[nom].server.*;
public class HelloWorldClient {
public static void main(String[] args) { try {
// Installe un gestionnaire de sécurité [nom]
System.setSecurityManager(new RMISecurityManager());
System.out.println("Recherche de l'objet serveur...");
HelloWorld hello =
(HelloWorld)Naming.lookup("[nom]://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 : Démarrage coté serveur
88
- Lancer la base de registres [nom] (elle doit pouvoir accéder aux classes Download - CLASSPATH) > rmiregistry
- Lancer le serveur Web servant les fichiers de classes Download
- 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é client
89
Le client doit pouvoir se connecter à [nom] machines distantes pour la base de registres [nom], 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 [nom] classes afin de pouvoir les télécharger
On va le lui préciser lors du lancement
> java -Djava.security.policy=client.policy
-Djava.[nom].server.codebase=[lien]
HelloWorldClient
Passage de paramètres
90
On sera souvent amenés a passer [nom] 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
Passage de paramètres: ATTENTION
91
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 [nom] exceptions
Attention aux objets sérialisables qui utilisent [nom] ressources locales
!!!
Conclusion
92
On a vu ce qu'est une invocation de méthode distante
On a vu le mécanisme [nom] stubs, ainsi que l'encodage [nom] paramètres
On a vu le déploiement avec téléchargement [nom]
classes dynamiquement
Nous avons même appliqué ces concepts au travers de l'exemple "HelloWorld » en [nom]
Erreurs classiques
Stub inaccessible au rmiregistry
- java.[nom].ServerException: RemoteException occurred in server ... java.[nom].UnmarshalException: error unmarshalling ... java.lang.ClassNotFoundException:
Le stub est accessible au serveur MAIS PAS AU rmiregistry
Attention à l’ordre d’appel : génération [nom] stubs et appel du rmiregistry rmiregistry pas lancé
Oubli du constructeur pour le RemoteObject unreported exception java.[nom].RemoteException in default constructorpublic class HelloImpl extends
UnicastRemoteObject implements Hello { · ^
rmiregistry déjà lancé java.[nom].server.ExportException: Port already in use: 1099On peut lancer un autre registry mais sur un autre port .
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.[nom].MarshalException: error marshalling arguments; nested exception
is: · [lien].NotSerializableException: CalculatorImpl
ATTENTION aux CLASSPATH et package Java
Une autre utilisation du rmiRegistry
95
import java.[nom].registry.LocateRegistry;
import java.[nom].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("[nom]://"+"localhost"+":"+ port +"/coucou", stub);