Nota:
pacchetto java.rmi : Remote Method Invocation (RMI) è stato deprecato in Java 9 e versioni successive, a favore di altri meccanismi di comunicazione remota come servizi Web o Remote Procedure Calls (RPC).
Remote Method Invocation (RMI) è un'API che consente a un oggetto di invocare un metodo su un oggetto che esiste in un altro spazio di indirizzi, che potrebbe trovarsi sulla stessa macchina o su una macchina remota. Tramite RMI, un oggetto in esecuzione in una JVM presente su un computer (lato client) può richiamare metodi su un oggetto presente in un'altra JVM (lato server). RMI crea un oggetto server remoto pubblico che abilita le comunicazioni lato client e server tramite semplici chiamate al metodo sull'oggetto server.
Oggetto stub: L'oggetto stub sulla macchina client crea un blocco di informazioni e invia queste informazioni al server.
Il blocco è composto da
- Un identificatore dell'oggetto remoto da utilizzare
- Nome del metodo che deve essere richiamato
- Parametri sulla JVM remota
Oggetto scheletro: L'oggetto scheletro passa la richiesta dall'oggetto stub all'oggetto remoto. Esegue i seguenti compiti
- Chiama il metodo desiderato sull'oggetto reale presente sul server.
- Inoltra i parametri ricevuti dall'oggetto stub al metodo.
Funzionamento dell'RMI
La comunicazione tra client e server viene gestita utilizzando due oggetti intermedi: oggetto Stub (sul lato client) e oggetto Skeleton (sul lato server), come può anche essere rappresentato dal supporto sottostante come segue:

Questi sono i passaggi da seguire in sequenza per implementare l'interfaccia come definita di seguito come segue:
- Definizione di un'interfaccia remota
- Implementazione dell'interfaccia remota
- Creazione di oggetti Stub e Skeleton dalla classe di implementazione utilizzando rmic (compilatore RMI)
- Avvia la registrazione
- Creare ed eseguire il programma applicativo del server
- Creare ed eseguire il programma applicativo client.
Passaggio 1: definizione dell'interfaccia remota
La prima cosa da fare è creare un'interfaccia che fornisca la descrizione dei metodi che possono essere invocati dai client remoti. Questa interfaccia dovrebbe estendere l'interfaccia Remote e il prototipo del metodo all'interno dell'interfaccia dovrebbe generare RemoteException.
Esempio:
apache
Giava
// Creating a Search interface> import> java.rmi.*;> public> interface> Search>extends> Remote> {> >// Declaring the method prototype> >public> String query(String search)>throws> RemoteException;> }> |
algoritmo sottile
>
>
Passaggio 2: implementazione dell'interfaccia remota
Il passo successivo è implementare l'interfaccia remota. Per implementare l'interfaccia remota, la classe dovrebbe estendersi alla classe UnicastRemoteObject del pacchetto java.rmi. Inoltre, è necessario creare un costruttore predefinito per lanciare l'eccezione java.rmi.RemoteException dal suo costruttore genitore nella classe.
Giava
mylivericket
// 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;> >}> }> |
>
>
Passaggio 3: creazione di oggetti Stub e Skeleton dalla classe di implementazione utilizzando rmic
Lo strumento rmic viene utilizzato per invocare il compilatore rmi che crea gli oggetti Stub e Skeleton. Il suo prototipo è nomeclasse rmic. Per il programma precedente è necessario eseguire il seguente comando al prompt dei comandi
rmic SearchQuery.
Passaggio 4: avviare il registro rmi
Avviare il servizio di registro immettendo il seguente comando al prompt dei comandi start rmiregistry
Passaggio 5: creare ed eseguire il programma applicativo del server
Il passaggio successivo consiste nel creare il programma applicativo del server ed eseguirlo su un prompt dei comandi separato.
- Il programma server utilizza il metodo createRegistry della classe LocateRegistry per creare rmiregistry all'interno della JVM del server con il numero di porta passato come argomento.
- Il metodo rebind della classe Naming viene utilizzato per associare l'oggetto remoto al nuovo nome.
Giava
Greatandhra
// 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);> >}> >}> }> |
>
>
Passaggio 6: creare ed eseguire il programma applicativo client
L'ultimo passaggio consiste nel creare il programma applicativo client ed eseguirlo su un prompt dei comandi separato. Il metodo di ricerca della classe Naming viene utilizzato per ottenere il riferimento dell'oggetto Stub.
Giava
// 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);> >}> >}> }> |
>
>
attraversamento postordine di un albero binario
Nota: Il programma client e server di cui sopra viene eseguito sulla stessa macchina, quindi viene utilizzato localhost. Per poter accedere all'oggetto remoto da un'altra macchina, localhost deve essere sostituito con l'indirizzo IP in cui è presente l'oggetto remoto.
salva i file rispettivamente secondo il nome della classe come
Search.java, SearchQuery.java, SearchServer.java e ClientRequest.java
Osservazioni importanti:
- RMI è una soluzione Java pura per le chiamate di procedura remota (RPC) e viene utilizzata per creare applicazioni distribuite in Java.
- Gli oggetti Stub e Skeleton vengono utilizzati per la comunicazione tra il client e il lato server.