Tout sur le registre Java RMI et son utilisation

Tout sur le registre Java RMI et son utilisation / La programmation

RMI représente invocation de méthode à distance et, comme son nom l’indique, il s’agit d’un protocole permettant à un programme Java d’appeler une méthode d’un objet s'exécutant sur un autre ordinateur. Il fournit une API Que sont les API et comment les API ouvertes modifient-elles Internet? Que sont les API et comment les API ouvertes modifient-elles Internet? Vous êtes-vous déjà demandé comment les programmes de votre ordinateur et les sites Web que vous visitez se "dialoguent"? En savoir plus (interface de programmation d'application) pour exporter un objet d'un programme (appelé serveur) et appeler les méthodes de cet objet d'un autre programme (appelé client), éventuellement exécuté sur un autre ordinateur.

Le java Registre RMI est un composant clé du système Java RMI et fournit un répertoire centralisé permettant aux serveurs d’enregistrer les services et aux clients de rechercher ces services. Dans cet article, nous apprenons à implémenter un serveur pour exposer un objet et un client à appeler une méthode sur le serveur, ainsi qu'à enregistrer et à rechercher le service dans le registre RMI..

Déclaration de l'interface du serveur

Pour apprendre les subtilités du fonctionnement du système Java RMI, implémentons un objet serveur simple fournissant une méthode pour accepter un nom et renvoyer un message d'accueil. Voici la définition de l'interface objet:

importer java.rmi.Remote; importer java.rmi.RemoteException; interface publique Le message d'accueil s'étend à distance message d'accueil public String (nom de chaîne) lève RemoteException;  

Le nom de l'interface s'appelle Salutation. Il fournit une seule méthode appelée saluer() qui accepte un nom et renvoie un message d'accueil approprié.

Pour marquer cette interface comme exportable, il faut étendre la java.rmi.Remote interface. De plus, la méthode doit déclarer un jette liste de clause java.rmi.RemoteException en plus des exceptions spécifiques à une application Exceptions Java: les manipulez-vous correctement? Exceptions Java: les manipulez-vous correctement? Une exception en programmation signifie une condition exceptionnelle dans l'exécution du programme. Il est utilisé lorsque la maladie peut être mieux gérée ailleurs. Considérez les exemples suivants de gestion des exceptions Java. Lire la suite . Ainsi, le code client peut gérer (ou propager) des erreurs d’appel de méthodes distantes telles que Hébergeur non trouvé, Échec de connexion, etc.

Implémentation de l'objet serveur

Après avoir déclaré l’interface (utilisée par les clients), nous implémentons l’objet côté serveur et fournissons le saluer() méthode comme indiqué. Il utilise une simple chaîne de format pour formater le message d'accueil.

La classe publique GreetingObject implémente Greeting private String fmtString = "Hello,% s"; public String greet (nom de chaîne) return String.format (this.fmtString, name);  

La méthode principale du serveur

Nous allons maintenant rassembler toutes ces pièces et mettre en œuvre le principale() méthode du serveur. Passons en revue chacune des étapes pertinentes.

  • La première étape consiste à créer l'implémentation de l'objet serveur..
    Message d'accueil = new GreetingObject (); 
  • Ensuite, nous obtenons un stub pour l'objet serveur à partir du runtime RMI. Le stub implémente la même interface que l'objet serveur. Cependant, la méthode implémente la communication requise avec l'objet serveur distant. Ce stub est utilisé par le client pour appeler de manière transparente la méthode sur l'objet serveur..
    Message d'accueil = (Message d'accueil) UnicastRemoteObject.exportObject (message d'accueil, 0); 
  • Une fois le stub obtenu, nous le transmettons au registre RMI pour qu'il se connecte à un service nommé spécifié. Lorsque le client demande une implémentation de ce service, il reçoit le stub qui sait comment communiquer avec l'objet serveur. Dans la suite, la méthode statique LocateRegistry.getRegistry () est utilisé pour obtenir la référence du registre local. le rebind () méthode est ensuite utilisée pour lier le nom au stub.
    String name = "Greeting"; Registry registry = LocateRegistry.getRegistry (port); registry.rebind (nom, titre); 

La méthode principale complète.

importer java.rmi.registry.LocateRegistry; importer java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; public class Main statique public void main (String [] args) lève Exception if (args.length == 0) System.err.println ("usage: java Port principal #"); System.exit (1);  int index = 0; int port = Integer.parseInt (args [index ++]); String name = "Greeting"; Message d'accueil = new GreetingObject (); Message d'accueil = (Message d'accueil) UnicastRemoteObject.exportObject (message d'accueil, 0); Registry registry = LocateRegistry.getRegistry (port); registry.rebind (nom, titre); System.out.println ("Message d'accueil lié à \" "+ nom +" \ "");  

Construire le serveur

Voyons maintenant comment construire le serveur. Pour que les choses restent simples, nous construisons à l'aide de la ligne de commande sous Linux plutôt que d'un outil de compilation tel que Maven..

Ce qui suit compile les fichiers source en fichiers de classe dans un répertoire cible.

rm -rf cible mkdir cible javac -d cible src / server / *. java 

Recueillir les fichiers de classe dans un fichier JAR pour exécution.

jar cvf cible / rmi-server.jar -C serveur cible 

Nous recueillons également les fichiers d’interface nécessaires à la compilation du client dans un fichier JAR de bibliothèque..

jar cvf cible / rmi-lib.jar -C serveur cible / Greeting.class 

Implémentation du client

Voyons maintenant comment implémenter le client utilisé pour appeler les méthodes d'objet serveur.

  • Comme pour le serveur, obtenez une référence au registre en spécifiant le nom d’hôte sur lequel le registre est exécuté et le numéro de port..
    Registry registry = LocateRegistry.getRegistry (hôte, port); 
  • Ensuite, recherchez le service dans le registre. le Chercher() La méthode retourne un stub qui peut être utilisé pour appeler des services.
    Salutation salutation = (salutation) registry.lookup (nom); 
  • Et invoquer la méthode en passant les arguments requis. Ici, nous obtenons le message d'accueil en passant le nom et en l'imprimant.
    System.out.println (nom + "rapporté:" + greeting.greet (myName)); 

Le code client complet:

client de paquet; importer java.rmi.registry.LocateRegistry; importer java.rmi.registry.Registry; import server.Greeting; public class Client static public void main (String [] args) émet Exception if (args.length! = 3) System.err.println ("usage: java Hôte du client port port MyName"); System.exit (1);  int index = 0; String host = args [index ++]; int port = Integer.parseInt (args [index ++]); String myName = args [index ++]; String name = "Greeting"; Registry registry = LocateRegistry.getRegistry (hôte, port); Salutation salutation = (salutation) registry.lookup (nom); System.out.println (nom + "rapporté:" + greeting.greet (myName));  

Le registre RMI

Lançons maintenant le programme serveur pour qu’il puisse commencer à répondre aux demandes..

java -cp cible / rmi-server.jar server.Main 1099 # lève une exception dans le fil "principal" java.rmi.ConnectException: connexion refusée à l'hôte: xxx; exception imbriquée est: java.net.ConnectException: connexion refusée 

En quoi consiste cette exception Comment gérer les exceptions Java de la bonne manière Comment gérer les exceptions de Java de manière appropriée Dans cet article, vous apprendrez quelles sont les exceptions Java, pourquoi elles sont importantes, comment les utiliser et comment éviter les erreurs courantes. Lire la suite ? Connexion rejetée.

La raison pour laquelle vous obtenez cette exception est due aux raisons suivantes: Notez, dans le code serveur, qu'il tente de se connecter au registre local sur le port 1099. Si cela échoue, vous vous retrouvez avec cette exception..

La solution consiste à exécuter le registre RMI. Le registre RMI est un programme fourni avec la machine virtuelle Java et est appelé la chimie. Il devrait être situé dans le poubelle répertoire de l'installation de la machine virtuelle Java. Le lancer est aussi simple que:

/usr/lib/jvm/jdk1.8.0_71/bin/rmiregistry 

Par défaut, le registre écoute sur le port 1099. Pour qu'il écoute sur un autre port, spécifiez le numéro de port comme suit:

/usr/lib/jvm/jdk1.8.0_71/bin/rmiregistry 1100 

Vérifiez qu’il existe bien un écouteur sur le port spécifié à l’aide de la commande netstat. 8 commandes CMD de gestion des réseaux (sans fil) sous Windows 8 commandes CMD de gestion des réseaux (sans fil) de Windows Si vous souhaitez un contrôle total et absolu de votre réseau, vous 'devra commencer à utiliser l'invite de commande. Voici les commandes les plus utiles pour gérer et dépanner votre réseau domestique. Lire la suite :

netstat -an -t tcp -p | grep LISTEN… tcp6 0 0 ::: 1100 ::: * LISTEN 23450 / rmiregistry 

Lancer le serveur

Essayons maintenant de relancer le serveur.

java -cp cible / rmi-server.jar server.Main 1100 # lève java.rmi.UnmarshalException: erreur unmarshalling arguments… Causée par: java.lang.ClassNotFoundException: server.Greeting… 

Une exception encore! Qu'est-ce qu'il y a cette fois?

Le serveur est incapable de charger la classe d'interface server.Greeting. Cela est dû au fait que le registre RMI est incapable de charger la classe requise. Vous devez donc spécifier l'emplacement des classes requises. Une façon de le faire est de spécifier la variable d’environnement CLASSPATH:

CLASSPATH =… /… /junk/target/rmi-lib.jar /usr/lib/jvm/jdk1.8.0_71/bin/rmiregistry 1100 

Essayer de relancer le serveur donne:

java -cp cible / rmi-server.jar server.Main 1100 # affiche le message d'accueil lié à "Message d'accueil" 

Maintenant le serveur tourne.

Lancer le client

Une fois toutes les pièces assemblées et exécutées, l’exécution du client est simple. Il a besoin des fichiers JAR appropriés pour son exécution. Ceux-ci incluent la classe contenant le principale() méthode et la classe d'interface. Il accepte les arguments indiquant l'emplacement du registre RMI, ainsi qu'un nom pour le message d'accueil..

java -cp cible / rmi-client.jar: cible / rmi-lib.jar client.Client localhost 1100 Peter # prints Salutation signalée: Bonjour, Peter 

Résumé

Java RMI fournit une API et des outils facilitant l'exécution de code à distance. Vous pouvez implémenter un serveur qui enregistre un objet de service dans le registre Java RMI. Les clients peuvent interroger le registre et obtenir un talon d'objet de service pour appeler les méthodes de service. Comme cet exemple l'illustre, tout est assez simple.

Utilisez-vous Java RMI dans votre projet? Quelle a été votre expérience? Y a-t-il des alternatives que vous avez étudiées? Veuillez nous en informer dans les commentaires ci-dessous.

En savoir plus sur: Java.