Implémentation RMI
L'implémentation RMI est constituée de trois couches d'abstraction.
Ces couches d'abstraction sont les suivantes :
- La couche stub et squelette qui intercepte les appels de méthodes effectués par le client dans la variable de référence d'interface et redirige ces appels vers un service RMI distant.
- La couche Référence distante sait interpréter et gérer les références effectuées par les clients aux objets de service distants.
- La couche du bas est la couche Transport qui repose sur des connexions TCP/IP entre les machines dans un réseau. Elle fournit la connectivité de base et des stratégies de pénétration de pare-feu.

En plus de la couche TCP/IP, RMI utilise un protocole de niveau connexion appelé Java™ Remote Method Protocol (JRMP), qui fonctionne comme suit:
- Les objets qui nécessitent un comportement distant doivent étendre la classe RemoteObject généralement via la sous-classe UnicastRemoteObject.
- La sous-classe UnicastRemoteObject exporte l'objet distant pour le rendre disponible pour gérer les appels RMI entrants.
- L'exportation de l'objet distant crée un socket serveur qui est lié à un numéro de port.
- Une unité d'exécution est également créée pour écouter les connexions sur ce socket. Le serveur est enregistré dans un registre.
- Un client obtient les informations de connexion au serveur depuis le registre.
- En utilisant ces informations du registre, qui contiennent le nom d'hôte et les détails de port du socket d'écoute du serveur, le client se connecte au serveur.
- Lorsque le client émet un appel de méthode distante vers le serveur, il crée un objet TCPConnection qui ouvre un socket vers le serveur sur le port spécifié et envoie les informations d'en-tête RMI et les arguments sérialisé via cette connexion en utilisant la classe StreamRemoteCall.
- Côté serveur :
- Lorsqu'un client se connecte à un socket de serveur, une unité d'exécution est affectée pour gérer l'appel entrant. L'unité d'exécution d'origine peut continuer d'écouter le socket d'origine pour que des appels supplémentaires des autres clients puissent être émis.
- Le serveur lit les informations d'en-tête et crée un objet RemoteCall pour désérialiser les arguments RMI depuis le socket.
- La méthode serviceCall() de la classe Transport gère l'appel entrant en le répartissant.
- La méthode dispatch() appelle la méthode appropriée et envoie le résultat dans la connexion.
- Si l'objet serveur envoie une exception, le serveur l'intercepte et la sérialise dans la connexion à la place de la valeur retournée.
- De retour côté client :
- La valeur retournée de l'interface RMI est désérialisée et renvoyée du stub au code du client lui-même.
- Si une exception est émise par le serveur, elle est désérialisée et émise à partir du stub.