Alles über die Java RMI-Registry und deren Verwendung

Alles über die Java RMI-Registry und deren Verwendung / Programmierung

RMI steht für Fernmethodenaufruf und, wie der Name schon sagt, ein Protokoll für ein Java-Programm zum Aufrufen einer Methode eines Objekts, das auf einem anderen Computer ausgeführt wird. Es bietet eine API. Was sind APIs und wie verändern offene APIs das Internet? Was sind APIs und wie ändern offene APIs das Internet? Haben Sie sich jemals gefragt, wie Programme auf Ihrem Computer und die von Ihnen besuchten Websites miteinander "sprechen"? Weitere Informationen (Anwendungsprogrammierschnittstelle) zum Exportieren eines Objekts aus einem Programm (als Server bezeichnet) und zum Aufrufen der Methoden dieses Objekts aus einem anderen Programm (als Client bezeichnet), das möglicherweise auf einem anderen Computer ausgeführt wird.

Das Java RMI-Registry ist eine Schlüsselkomponente des Java-RMI-Systems und stellt ein zentrales Verzeichnis für Server zur Registrierung von Diensten und für Clients zum Nachschlagen dieser Dienste bereit. In diesem Artikel erfahren Sie, wie Sie einen Server implementieren, um ein Objekt und einen Client zum Aufrufen einer Methode auf dem Server verfügbar zu machen, und wie Sie den Dienst in der RMI-Registrierung registrieren und nachschlagen.

Server-Schnittstelle deklarieren

Um die Feinheiten der Funktionsweise des Java-RMI-Systems kennenzulernen, lassen Sie uns ein einfaches Serverobjekt implementieren, das eine Methode zum Akzeptieren eines Namens und zum Zurückgeben einer Begrüßung bereitstellt. Hier ist die Definition der Objektschnittstelle:

import java.rmi.Remote; importiere java.rmi.RemoteException; public interface Gruß erweitert Remote public String greet (String-Name) löst RemoteException aus;  

Der Name der Schnittstelle wird aufgerufen Gruß. Es bietet eine einzige Methode, die aufgerufen wird grüßen() die einen Namen akzeptiert und eine passende Begrüßung zurücksendet.

Um diese Schnittstelle als exportierbar zu kennzeichnen, muss sie erweitert werden java.rmi.Remote Schnittstelle. Die Methode muss auch eine deklarieren wirft klausel auflistung java.rmi.RemoteException zusätzlich zu anwendungsspezifischen Ausnahmen Java-Ausnahmen: Behandeln Sie sie richtig? Java-Ausnahmen: Behandeln Sie sie richtig? Eine Ausnahme bei der Programmierung bedeutet eine außergewöhnliche Bedingung bei der Programmausführung. Es wird verwendet, wenn der Zustand anderswo besser gehandhabt werden kann. Beachten Sie die folgenden Beispiele für die Behandlung von Java-Ausnahmen. Weiterlesen . Auf diese Weise kann der Clientcode Fehler beim Aufruf entfernter Methoden verarbeiten (oder weiterleiten), z Host nicht gefunden, Verbindungsfehler, usw.

Implementieren des Serverobjekts

Nach der Deklaration der Schnittstelle (die von den Clients verwendet wird) implementieren wir das serverseitige Objekt und stellen das bereit grüßen() Methode wie gezeigt. Die Begrüßung wird mit einer einfachen Formatzeichenfolge formatiert.

public class GreetingObject implementiert Greeting private String fmtString = "Hallo,% s"; public String greet (Stringname) return String.format (this.fmtString, name);  

Die Hauptmethode des Servers

Lassen Sie uns nun alle diese Teile zusammenfassen und die Main() Methode des Servers. Lassen Sie uns alle relevanten Schritte durchgehen.

  • Der erste Schritt ist das Erstellen der Serverobjekt-Implementierung.
    Begrüßung Begrüßung = neues Begrüßungsobjekt (); 
  • Als Nächstes erhalten wir einen Stub für das Serverobjekt von der RMI-Laufzeitumgebung. Der Stub implementiert dieselbe Schnittstelle wie das Serverobjekt. Die Methode implementiert jedoch die erforderliche Kommunikation mit dem Remote-Serverobjekt. Dieser Stub wird vom Client verwendet, um die Methode transparent für das Serverobjekt aufzurufen.
    Begrüßungsstub = (Begrüßung) UnicastRemoteObject.exportObject (Begrüßung, 0); 
  • Sobald der Stub erhalten wurde, übergeben wir ihn an die RMI-Registry, um an einen angegebenen benannten Dienst zu binden. Wenn der Client eine Implementierung dieses Dienstes anfordert, erhält er den Stub, der mit dem Serverobjekt kommunizieren kann. Im Folgenden die statische Methode LocateRegistry.getRegistry () wird verwendet, um die lokale Registrierungsreferenz zu erhalten. Das neu binden() Diese Methode wird dann verwendet, um den Namen an den Stub zu binden.
    String name = "Begrüßung"; Registry Registry = LocateRegistry.getRegistry (Port); registry.rebind (name, stub); 

Die komplette Hauptmethode.

import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; public class Main statisch public void main (String [] args) löst Exception if (args.length == 0) System.err.println ("usage: java Main port #"); System.exit (1);  int index = 0; int port = Integer.parseInt (args [index ++]); String name = "Begrüßung"; Begrüßung Begrüßung = neues Begrüßungsobjekt (); Begrüßungsstub = (Begrüßung) UnicastRemoteObject.exportObject (Begrüßung, 0); Registry Registry = LocateRegistry.getRegistry (Port); registry.rebind (name, stub); System.out.println ("Begrüßung an \" "+ name +" \ "" gebunden);  

Server aufbauen

Lassen Sie uns nun einen Blick auf den Aufbau des Servers werfen. Der Einfachheit halber wird unter Verwendung der Befehlszeile unter Linux ein Build-Tool wie Maven verwendet.

Im Folgenden werden die Quelldateien in Klassendateien in einem Zielverzeichnis kompiliert.

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

Sammeln Sie die Klassendateien zur Ausführung in eine JAR-Datei.

jar cvf target / rmi-server.jar -C Zielserver 

Wir erfassen auch die Schnittstellendateien, die zum Kompilieren des Clients in einer Bibliotheks-JAR erforderlich sind.

jar cvf target / rmi-lib.jar -C Zielserver / Greeting.class 

Den Client implementieren

Betrachten wir nun den Client, der zum Aufrufen der Server-Objektmethoden verwendet wird.

  • Rufen Sie wie beim Server einen Verweis auf die Registrierung ab und geben Sie den Hostnamen, unter dem die Registrierung ausgeführt wird, sowie die Portnummer an.
    Registry Registry = LocateRegistry.getRegistry (Host, Port); 
  • Suchen Sie als Nächstes den Dienst in der Registrierung. Das Sieh nach oben() Die Methode gibt einen Stub zurück, der zum Aufrufen von Services verwendet werden kann.
    Begrüßung Begrüßung = (Begrüßung) registry.lookup (Name); 
  • Rufen Sie die Methode auf, und übergeben Sie die erforderlichen Argumente. Hier erhalten wir die Begrüßung, indem wir den Namen übergeben und ausdrucken.
    System.out.println (name + "berichtet:" + greeting.greet (meinName)); 

Der vollständige Kundencode:

Paket-Client; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; Server importieren.Greeting; public class Client statisch public void main (String [] args) löst Exception if (args.length! = 3) System.err.println ("usage: java Client-Hostport myName"); System.exit (1);  int index = 0; String host = args [index ++]; int port = Integer.parseInt (args [index ++]); Zeichenfolge myName = args [index ++]; String name = "Begrüßung"; Registry Registry = LocateRegistry.getRegistry (Host, Port); Begrüßung Begrüßung = (Begrüßung) registry.lookup (Name); System.out.println (name + "berichtet:" + greeting.greet (meinName));  

Die RMI-Registry

Lassen Sie uns nun das Server-Programm ausführen, damit es Anfragen bedienen kann.

java -cp target / rmi-server.jar server.Main 1099 # löst Ausnahme im Thread "main" java.rmi.ConnectException aus: Verbindung wurde nicht gehostet: xxx; verschachtelte Ausnahme ist: java.net.ConnectException: Verbindung abgelehnt 

Was ist diese Ausnahme? So behandeln Sie Java-Ausnahmen auf die richtige Art. So behandeln Sie Java-Ausnahmen auf die richtige Art. In diesem Artikel erfahren Sie, was Java-Ausnahmen sind, warum sie wichtig sind, wie sie verwendet werden müssen, und wie Sie Fehler vermeiden. Weiterlesen ? Verbindung abgelehnt.

Sie erhalten diese Ausnahmebedingung aus folgenden Gründen: Beachten Sie, dass der Servercode versucht, eine Verbindung zur lokalen Registrierung an Port 1099 herzustellen. Wenn dies fehlschlägt, erhalten Sie diese Ausnahmebedingung.

Die Lösung besteht darin, die RMI-Registry auszuführen. Die RMI-Registry ist ein Programm, das mit der Java Virtual Machine ausgeliefert wird und aufgerufen wird Radiosendung. Es sollte sich in der Behälter Verzeichnis der Java Virtual Machine-Installation. Das Ausführen ist so einfach wie:

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

Standardmäßig überwacht die Registrierung Port 1099. Geben Sie die Portnummer wie folgt an, um einen anderen Port abhören zu können:

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

Überprüfen Sie mit dem Befehl netstat, ob am angegebenen Port ein Listener vorhanden ist. 8 CMD-Befehle zum Verwalten von (drahtlosen) Netzwerken in Windows 8 CMD-Befehle zum Verwalten von (drahtlosen) Netzwerken in Windows Wenn Sie vollständige und uneingeschränkte Kontrolle über Ihr Netzwerk haben möchten, dann Sie muss mit der Eingabeaufforderung beginnen. Hier finden Sie die nützlichsten Befehle zur Verwaltung und Fehlerbehebung Ihres Heimnetzwerks. Weiterlesen :

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

Ausführen des Servers

Lassen Sie uns jetzt versuchen, den Server erneut auszuführen.

java -cp target / rmi-server.jar server.Main 1100 # löst java.rmi.UnmarshalException aus: Fehler beim Entfernen der Argumente… verursacht durch: java.lang.ClassNotFoundException: server.Greeting… 

Wieder eine Ausnahme! Was ist es diesmal?

Der Server kann die Schnittstellenklasse nicht laden Server. Begrüßung. Dies geschieht, weil die RMI-Registry die erforderliche Klasse nicht laden kann. Sie müssen also den Ort der erforderlichen Klassen angeben. Eine Möglichkeit besteht darin, die Umgebungsvariable CLASSPATH anzugeben:

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

Wenn Sie versuchen, den Server erneut auszuführen, erhalten Sie Folgendes:

java -cp target / rmi-server.jar server.Main 1100 # druckt Begrüßung an "Begrüßung" gebunden 

Nun läuft der Server.

Den Client ausführen

Nachdem alle Teile zusammengebaut und ausgeführt wurden, ist die Ausführung des Clients einfach. Es benötigt die entsprechenden JARs zur Ausführung. Dazu gehört die Klasse, die das enthält Main() Methode und die Schnittstellenklasse. Es akzeptiert Argumente, die angeben, wo die RMI-Registry ausgeführt wird, und einen Namen für die Begrüßung.

java -cp target / rmi-client.jar: target / rmi-lib.jar client.Client localhost 1100 Peter # Prints Begrüßung: Hallo Peter 

Zusammenfassung

Java RMI bietet eine API und Tools, um die Codeausführung von Remotestandorten aus zu vereinfachen. Sie können einen Server implementieren, der ein Serviceobjekt in der Java RMI-Registrierung registriert. Clients können die Registrierung abfragen und einen Serviceobjekt-Stub zum Aufrufen der Servicemethoden anfordern. Wie dieses Beispiel zeigt, ist alles recht einfach.

Verwenden Sie Java RMI in Ihrem Projekt? Was war deine Erfahrung? Gibt es Alternativen, die Sie untersucht haben? Bitte teilen Sie uns in den Kommentaren unten mit.

Erfahren Sie mehr über: Java.