logo

Remote-Methodenaufruf in Java

Notiz:
java.rmi-Paket : Remote Method Invocation (RMI) wurde in Java 9 und späteren Versionen zugunsten anderer Remote-Kommunikationsmechanismen wie Webdiensten oder Remote Procedure Calls (RPC) veraltet.

Remote Method Invocation (RMI) ist eine API, die es einem Objekt ermöglicht, eine Methode für ein Objekt aufzurufen, das in einem anderen Adressraum vorhanden ist, der sich auf demselben Computer oder auf einem Remotecomputer befinden kann. Über RMI kann ein Objekt, das in einer auf einem Computer vorhandenen JVM (Client-Seite) ausgeführt wird, Methoden für ein Objekt aufrufen, das in einer anderen JVM (Server-Seite) vorhanden ist. RMI erstellt ein öffentliches Remote-Serverobjekt, das client- und serverseitige Kommunikation durch einfache Methodenaufrufe auf dem Serverobjekt ermöglicht.



Stub-Objekt: Das Stub-Objekt auf dem Client-Computer erstellt einen Informationsblock und sendet diese Informationen an den Server.

Der Block besteht aus

  • Eine Kennung des zu verwendenden Remoteobjekts
  • Methodenname, der aufgerufen werden soll
  • Parameter für die Remote-JVM

Skelettobjekt: Das Skelettobjekt leitet die Anfrage vom Stub-Objekt an das Remote-Objekt weiter. Es führt die folgenden Aufgaben aus



  • Es ruft die gewünschte Methode für das reale Objekt auf, das auf dem Server vorhanden ist.
  • Es leitet die vom Stub-Objekt empfangenen Parameter an die Methode weiter.

Funktionsweise von RMI

Die Kommunikation zwischen Client und Server wird über zwei Zwischenobjekte abgewickelt: Stub-Objekt (auf Client-Seite) und Skeleton-Objekt (auf Server-Seite), wie auch in den folgenden Medien wie folgt dargestellt werden kann:

Dies sind die Schritte, die nacheinander ausgeführt werden müssen, um die Schnittstelle wie unten definiert wie folgt zu implementieren:



  1. Definieren einer Remote-Schnittstelle
  2. Implementierung der Remote-Schnittstelle
  3. Erstellen von Stub- und Skeleton-Objekten aus der Implementierungsklasse mit rmic (RMI-Compiler)
  4. Starten Sie die RMI-Registrierung
  5. Erstellen Sie das Serveranwendungsprogramm und führen Sie es aus
  6. Erstellen Sie das Client-Anwendungsprogramm und führen Sie es aus.

Schritt 1: Definieren der Remote-Schnittstelle

Als Erstes muss eine Schnittstelle erstellt werden, die die Beschreibung der Methoden bereitstellt, die von Remote-Clients aufgerufen werden können. Diese Schnittstelle sollte die Remote-Schnittstelle erweitern und der Methodenprototyp innerhalb der Schnittstelle sollte die RemoteException auslösen.

Beispiel:

diskrete Mathematik-Negation

Java




// Creating a Search interface> import> java.rmi.*;> public> interface> Search>extends> Remote> {> >// Declaring the method prototype> >public> String query(String search)>throws> RemoteException;> }>

>

>

Schritt 2: Implementierung der Remote-Schnittstelle
Der nächste Schritt besteht darin, die Remote-Schnittstelle zu implementieren. Um die Remote-Schnittstelle zu implementieren, sollte die Klasse auf die UnicastRemoteObject-Klasse des java.rmi-Pakets erweitert werden. Außerdem muss ein Standardkonstruktor erstellt werden, um die java.rmi.RemoteException von seinem übergeordneten Konstruktor in der Klasse auszulösen.

Java


Ex des Benutzernamens



// Java program to implement the Search interface> import> java.rmi.*;> import> java.rmi.server.*;> public> class> SearchQuery>extends> UnicastRemoteObject> >implements> Search> {> >// Default constructor to throw RemoteException> >// from its parent constructor> >SearchQuery()>throws> RemoteException> >{> >super>();> >}> >// Implementation of the query interface> >public> String query(String search)> >throws> RemoteException> >{> >String result;> >if> (search.equals(>'Reflection in Java'>))> >result =>'Found'>;> >else> >result =>'Not Found'>;> >return> result;> >}> }>

>

>

Schritt 3: Erstellen von Stub- und Skeleton-Objekten aus der Implementierungsklasse mit rmic
Mit dem Tool rmic wird der RMI-Compiler aufgerufen, der die Stub- und Skeleton-Objekte erstellt. Sein Prototyp ist rmic-Klassenname. Für das obige Programm muss der folgende Befehl an der Eingabeaufforderung ausgeführt werden
rmic SearchQuery.
Schritt 4: Starten Sie die rmiregistry
Starten Sie den Registrierungsdienst, indem Sie an der Eingabeaufforderung den folgenden Befehl eingeben: start rmiregistry
Schritt 5: Erstellen Sie das Serveranwendungsprogramm und führen Sie es aus
Der nächste Schritt besteht darin, das Serveranwendungsprogramm zu erstellen und es an einer separaten Eingabeaufforderung auszuführen.

  • Das Serverprogramm verwendet die Methode „createRegistry“ der Klasse „LocateRegistry“, um rmiregistry innerhalb der Server-JVM mit der als Argument übergebenen Portnummer zu erstellen.
  • Die Rebind-Methode der Naming-Klasse wird verwendet, um das Remote-Objekt an den neuen Namen zu binden.

Java




// Java program for server application> import> java.rmi.*;> import> java.rmi.registry.*;> public> class> SearchServer> {> >public> static> void> main(String args[])> >{> >try> >{> >// Create an object of the interface> >// implementation class> >Search obj =>new> SearchQuery();> >// rmiregistry within the server JVM with> >// port number 1900> >LocateRegistry.createRegistry(>1900>);> >// Binds the remote object by the name> >// geeksforgeeks> >Naming.rebind(>' rmi://localhost:1900 '>+> >'/geeksforgeeks'>,obj);> >}> >catch>(Exception ae)> >{> >System.out.println(ae);> >}> >}> }>

>

Java-Programm

>

Schritt 6: Erstellen Sie das Client-Anwendungsprogramm und führen Sie es aus
Der letzte Schritt besteht darin, das Client-Anwendungsprogramm zu erstellen und es an einer separaten Eingabeaufforderung auszuführen. Die Lookup-Methode der Naming-Klasse wird verwendet, um die Referenz des Stub-Objekts abzurufen.

Java




// Java program for client application> import> java.rmi.*;> public> class> ClientRequest> {> >public> static> void> main(String args[])> >{> >String answer,value=>'Reflection in Java'>;> >try> >{> >// lookup method to find reference of remote object> >Search access => >(Search)Naming.lookup(>' rmi://localhost:1900 '>+> >'/geeksforgeeks'>);> >answer = access.query(value);> >System.out.println(>'Article on '> + value +> >' '> + answer+>' at techcodeview.com'>);> >}> >catch>(Exception ae)> >{> >System.out.println(ae);> >}> >}> }>

>

>

Notiz: Das obige Client- und Serverprogramm wird auf demselben Computer ausgeführt, daher wird localhost verwendet. Um von einem anderen Computer aus auf das Remote-Objekt zugreifen zu können, muss „localhost“ durch die IP-Adresse ersetzt werden, unter der das Remote-Objekt vorhanden ist.

Speichern Sie die Dateien entsprechend dem Klassennamen unter

Search.java, SearchQuery.java, SearchServer.java und ClientRequest.java
Wichtige Beobachtungen:

  1. RMI ist eine reine Java-Lösung für Remote Procedure Calls (RPC) und wird zum Erstellen verteilter Anwendungen in Java verwendet.
  2. Stub- und Skeleton-Objekte werden für die Kommunikation zwischen Client- und Serverseite verwendet.