Académique Documents
Professionnel Documents
Culture Documents
Invocation de Méthodes
à Distance
COURS : PROGRAMMATION RÉSEAU
R. HACHEMI
Appel de Procédure à Distance (RPC)
Permet d'appeler une procédure distante (d’invoquer une méthode sur un objet distant) aussi
facilement (ou presque) que lors d’un appel local.
Une partie serveur offre une opération (un service, une procédure) appelée par une partie client.
Appel de Procédure à Distance (RPC)
Idée
Pouvoir directement appeler ce service sur le serveur presque aussi facilement que si ce service
était local.
Principe
• Deux rôles distincts : client et serveur
• Le serveur offre la possibilité à des programmes distants d'appeler une ou plusieurs de ces
procédures.
• Le client appelle localement la procédure sur un élément spécial qui s’occupe de relayer la
demande d'appel au coté serveur.
• Coté serveur, un élément spécial appelle la procédure et renvoie le résultat au client.
• Eléments spéciaux : talons (ou stubs)
• Communication via des sockets.
Appel de Procédure à Distance (RPC)
Invocation de Méthode à Distance (RMI)
Fonctionnement général de RMI (Remote Method Invocation)
1. Le client récupère (via le service de nommage) une référence de l'objet distant (en réalité, une
référence locale)
2. Le client appelle une méthode sur cette référence d'objet (appel synchrone : il attend que
l'appel soit terminé pour continuer son exécution)
3. Le talon, qui reçoit cet appel, « compacte » (marshall) toutes les données relatives à l'appel
(identificateur opération + paramètres)
4. Le talon envoie les données au talon coté serveur
5. Le talon coté serveur décompacte les données (unmarshall) et procède à l’appel de la méthode.
6. Le talon coté serveur récupère la valeur de retour, la compacte et l'envoie au talon coté client
(même en l’absence de valeur de retour, on renvoie quelque chose au talon pour l'informer de
la fin de l'appel d'opération)
7. Le talon coté client décompacte la valeur et la retourne au client
8. L'appel de la méthode distante est terminé, le client continue son exécution
Invocation de Méthode à Distance (RMI)
java.rmi Package à utiliser pour des communications via RMI.
java.rmi.Remote Interface à spécialiser pour définir les opérations
(méthodes) appelables à distance.
Cette interface est utilisée des deux cotés (client et
serveur).
java.rmi.RemoteException La signature d’une méthode appelable à distance doit
préciser qu'elle peut lever une exception de ce type.
java.rmi.server.UnicastRemoteObject Le serveur doit implémenter l’interface spécialisant
java.rmi.Remote et doit en même temps
spécialiser (ou utiliser des services de) de cette classe.
Serializable Les classes des données transmis en paramètres ou des
données de retour des doivent implémenter cette
interface.
Interface Remote
Sert à définir les services (méthodes) appelables à distance.
Chacune de ces méthodes doit être susceptible de lever l'exception RemoteException (elles
peuvent bien évidemment lever d’autres exceptions liées à l'application)
RemoteException est la super classe d'une hiérarchie d'une vingtaine d'exceptions détaillant le
problème rencontré lors de l'appel de la méthode (NoSuchObjectException,
UnknowHostException, ConnectException, …).
Lors de l'implémentation des méthode de l'interface Remote, le programmeur n’a pas à spécifier
les cas d'erreurs correspondant à la levée d'une exception RemoteException, c'est le
middleware (Java) qui s’en charge.
Interface UnicastRemoteObject
Sert à la communication via sockets TCP.
L'objet de la classe implémentant l'interface doit « s'exporter » pour accepter des connexions de
clients.
- Unicast : l'objet de la classe implémentant l'interface existe en un seul exemplaire sur une seule
machine.
Le constructeur doit préciser dans sa signature qu'il peut lever l’exception RemoteException.
Remarque la classe peut implémenter d'autres méthodes mais seules les méthodes de
l'interfaces étendant Remote sont appelables à distance.
Registe rmiregistry
L’objet distant doit s’enregistrer auprès du service rmiregistry (registre, annuaire ...).
Variante de lancement : un objet Java peut à l'exécution lancer un rmiregistry via la méthode
statique de de java.rmi.registry.LocateRegistry :
public static Registry createRegistry(int port) throws
RemoteException
Classe java.rmi.Naming
Sert à enregistrer des objets et récupérer leurs références via les méthodes statiques suivantes :
- Si la classe implémente Remote : passage par adresse. On passe ou récupère la référence sur un
objet distant.
- Si classe n'implémente pas Remote : passage par valeur. L'objet est cloné, on passe ou récupère
une copie de l'objet.
- Si classe n'implémente pas Serializable : objet ne peut pas être paramètre ou la classe ne
peut pas être un type de retour. Les paramètres et les valeurs de retour sont forcément sérialisés
pour être transmis via le réseau (via des sockets).