Opmerking:
java.rmi-pakket : Remote Method Invocation (RMI) is verouderd in Java 9 en latere versies, ten gunste van andere externe communicatiemechanismen zoals webservices of Remote Procedure Calls (RPC).
Remote Method Invocation (RMI) is een API waarmee een object een methode kan aanroepen op een object dat zich in een andere adresruimte bevindt, die zich op dezelfde machine of op een externe machine kan bevinden. Via RMI kan een object dat draait in een JVM die aanwezig is op een computer (clientzijde) methoden aanroepen op een object dat aanwezig is in een andere JVM (serverzijde). RMI creëert een openbaar extern serverobject dat communicatie tussen client en server mogelijk maakt via eenvoudige methodeaanroepen op het serverobject.
Stub-object: Het stub-object op de clientmachine bouwt een informatieblok op en stuurt deze informatie naar de server.
Het blok bestaat uit
- Een identificatie van het te gebruiken externe object
- Methodenaam die moet worden aangeroepen
- Parameters voor de externe JVM
Skeletobject: Het skeletobject geeft het verzoek van het stub-object door aan het externe object. Het voert de volgende taken uit
- Het roept de gewenste methode aan op het echte object dat op de server aanwezig is.
- Het stuurt de parameters die zijn ontvangen van het stub-object door naar de methode.
Werkzaamheden van RMI
De communicatie tussen client en server wordt afgehandeld door twee tussenobjecten te gebruiken: Stub-object (aan clientzijde) en Skeleton-object (aan serverzijde), zoals ook als volgt vanaf de onderstaande media kan worden weergegeven:
Dit zijn de stappen die achtereenvolgens moeten worden gevolgd om Interface zoals hieronder gedefinieerd als volgt te implementeren:
- Een externe interface definiëren
- Implementatie van de externe interface
- Stub- en Skeleton-objecten maken vanuit de implementatieklasse met behulp van rmic (RMI-compiler)
- Start het rmi-register
- Creëer en voer het serverapplicatieprogramma uit
- Creëer en voer het clientapplicatieprogramma uit.
Stap 1: De externe interface definiëren
Het eerste dat u moet doen, is een interface maken die de beschrijving geeft van de methoden die door externe clients kunnen worden aangeroepen. Deze interface zou de externe interface moeten uitbreiden en het prototype van de methode binnen de interface zou de RemoteException moeten genereren.
Voorbeeld:
Java
// Creating a Search interface> import> java.rmi.*;> public> interface> Search> extends> Remote> {> > // Declaring the method prototype> > public> String query(String search)> throws> RemoteException;> }> |
>
>
Stap 2: Implementatie van de externe interface
De volgende stap is het implementeren van de externe interface. Om de externe interface te implementeren, moet de klasse zich uitbreiden tot de UnicastRemoteObject-klasse van het java.rmi-pakket. Er moet ook een standaardconstructor worden gemaakt om java.rmi.RemoteException van de bovenliggende constructor in de klasse te genereren.
Java
Java sorteert een lijst
// 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;> > }> }> |
>
>
Stap 3: Stub- en Skeleton-objecten maken vanuit de implementatieklasse met behulp van rmic
De rmic-tool wordt gebruikt om de rmi-compiler aan te roepen die de Stub- en Skeleton-objecten maakt. Het prototype is rmic classname. Voor het bovenstaande programma moet de volgende opdracht worden uitgevoerd vanaf de opdrachtprompt
rmic SearchQuery.
Stap 4: Start het rmiregister
Start de registerservice door de volgende opdracht uit te voeren op de opdrachtprompt start rmiregistry
Stap 5: Creëer en voer het serverapplicatieprogramma uit
De volgende stap is het maken van het serverapplicatieprogramma en het uitvoeren ervan op een aparte opdrachtprompt.
- Het serverprogramma gebruikt de createRegistry-methode van de LocateRegistry-klasse om rmiregistry te creëren binnen de server-JVM, waarbij het poortnummer als argument wordt doorgegeven.
- De rebind-methode van de klasse Naming wordt gebruikt om het externe object aan de nieuwe naam te 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);> > }> > }> }> |
>
>
Stap 6: Creëer en voer het clientapplicatieprogramma uit
De laatste stap is het maken van het clienttoepassingsprogramma en het uitvoeren ervan op een afzonderlijke opdrachtprompt. De opzoekmethode van de klasse Naming wordt gebruikt om de referentie van het Stub-object op te halen.
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);> > }> > }> }> |
>
>
Opmerking: Het bovenstaande client- en serverprogramma wordt op dezelfde machine uitgevoerd, dus localhost wordt gebruikt. Om toegang te krijgen tot het externe object vanaf een andere machine, moet localhost worden vervangen door het IP-adres waarop het externe object aanwezig is.
sla de bestanden respectievelijk op volgens de klassenaam als
Search.java, SearchQuery.java, SearchServer.java en ClientRequest.java
Belangrijke opmerkingen:
- RMI is een pure Java-oplossing voor Remote Procedure Calls (RPC) en wordt gebruikt om de gedistribueerde applicaties in Java te maken.
- Stub- en Skeleton-objecten worden gebruikt voor communicatie tussen de client- en serverzijde.