FRFAM.COM >> Famille >> Technologie &Innovation >> Informatique

Guide Complet du Registre Java RMI : Implémentation Serveur et Client

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.

Guide Complet du Registre Java RMI : Implémentation Serveur et Client

Déclaration de l'interface serveur

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

Implémentation de l'objet serveur

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

Méthode principale du serveur

Assemblons le tout dans la méthode main() du serveur. Étapes clés :

  • Créez l'instance serveur :
    Greeting greeting = new GreetingObject();
  • Générez un stub :
    Greeting stub = (Greeting) UnicastRemoteObject.exportObject(greeting, 0);
  • Liez au registre :
    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 + "'");
    }
}

Construction du serveur

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

Implémentation du client

Étapes pour le client (package client) :

  • Accédez au registre :
    Registry registry = LocateRegistry.getRegistry(host, port);
  • Recherchez le service :
    Greeting greeting = (Greeting) registry.lookup(name);
  • Invoquez :
    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));
    }
}

Le registre RMI

Démarrez rmiregistry (dans $JAVA_HOME/bin) avant le serveur :

rmiregistry 1100

Vérifiez : netstat -an -t tcp -p | grep LISTEN

Exécution du serveur

Avec CLASSPATH pour les classes :

export CLASSPATH=target/rmi-lib.jar
rmiregistry 1100 &
java -cp target/rmi-server.jar server.Main 1100

Sortie : "Greeting lié à 'Greeting'"

Exécution du client

java -cp target/rmi-client.jar:target/rmi-lib.jar client.Client localhost 1100 Pierre

Sortie : "Greeting dit : Bonjour, Pierre"

Résumé

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 !

[]