RMI signifie Remote Method Invocation (Invocation de Méthode à Distance). Ce protocole permet à un programme Java d'invoquer une méthode sur un objet exécuté sur une autre machine. RMI fournit une API pour exporter un objet depuis un serveur et l'invoquer depuis un client, potentiellement sur un hôte distant.
Le registre RMI est un composant essentiel de Java RMI. Il agit comme un répertoire centralisé où les serveurs enregistrent leurs services et les clients les recherchent. Dans ce guide détaillé, découvrez comment implémenter un serveur exposant un objet, un client l'invoquant, et utiliser le registre RMI pour lier et rechercher le service.

Pour illustrer le fonctionnement de Java RMI, créons un objet serveur simple qui accepte un nom et retourne un message de bienvenue. Voici la définition de l'interface :
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Greeting extends Remote {
String greet(String name) throws RemoteException;
}L'interface Greeting définit une méthode greet() qui prend un nom et renvoie une salutation. Pour l'exporter, elle doit étendre java.rmi.Remote. Chaque méthode distante doit déclarer throws RemoteException pour gérer les erreurs comme 'hôte introuvable' ou 'échec de connexion'.
Une fois l'interface définie (partagée avec le client), implémentez l'objet serveur :
public class GreetingObject implements Greeting {
private String fmtString = "Bonjour, %s";
public String greet(String name) {
return String.format(fmtString, name);
}
}Assemblons le tout dans la méthode main() du serveur. Étapes clés :
Greeting greeting = new GreetingObject();Greeting stub = (Greeting) UnicastRemoteObject.exportObject(greeting, 0);String name = "Greeting";
Registry registry = LocateRegistry.getRegistry(port);
registry.rebind(name, stub);Méthode principale complète (package server.Main) :
package server;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class Main {
public static void main(String[] args) throws Exception {
if (args.length == 0) {
System.err.println("Usage: java Main port");
System.exit(1);
}
int port = Integer.parseInt(args[0]);
String name = "Greeting";
Greeting greeting = new GreetingObject();
Greeting stub = (Greeting) UnicastRemoteObject.exportObject(greeting, 0);
Registry registry = LocateRegistry.getRegistry(port);
registry.rebind(name, stub);
System.out.println("Greeting lié à '" + name + "'");
}
}Compilez et emballez via ligne de commande (Linux) :
rm -rf target
mkdir target
javac -d target src/server/*.java
jar cvf target/rmi-server.jar -C target server
jar cvf target/rmi-lib.jar -C target server/Greeting.classÉtapes pour le client (package client) :
Registry registry = LocateRegistry.getRegistry(host, port);Greeting greeting = (Greeting) registry.lookup(name);greeting.greet(myName);Code client complet :
package client;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import server.Greeting;
public class Client {
public static void main(String[] args) throws Exception {
if (args.length != 3) {
System.err.println("Usage: java Client host port nom");
System.exit(1);
}
String host = args[0];
int port = Integer.parseInt(args[1]);
String myName = args[2];
String name = "Greeting";
Registry registry = LocateRegistry.getRegistry(host, port);
Greeting greeting = (Greeting) registry.lookup(name);
System.out.println(name + " dit : " + greeting.greet(myName));
}
}Démarrez rmiregistry (dans $JAVA_HOME/bin) avant le serveur :
rmiregistry 1100Vérifiez : netstat -an -t tcp -p | grep LISTEN
Avec CLASSPATH pour les classes :
export CLASSPATH=target/rmi-lib.jar
rmiregistry 1100 &
java -cp target/rmi-server.jar server.Main 1100Sortie : "Greeting lié à 'Greeting'"
java -cp target/rmi-client.jar:target/rmi-lib.jar client.Client localhost 1100 PierreSortie : "Greeting dit : Bonjour, Pierre"
Java RMI simplifie l'exécution de code distant via API et outils. Enregistrez des objets au registre ; les clients obtiennent des stubs pour invoquer les méthodes. Exemple simple et efficace.
Utilisez-vous Java RMI ? Partagez votre expérience ou alternatives en commentaires !
[]