Tutto sul registro RMI Java e come utilizzarlo

Tutto sul registro RMI Java e come utilizzarlo / Programmazione

RMI sta per invocazione del metodo remoto e, come indica il nome, è un protocollo per un programma Java per richiamare un metodo di un oggetto in esecuzione su un altro computer. Fornisce un'API Quali sono le API e Come le API aperte cambiano Internet Quali sono le API e come vengono aperte le API Modifica di Internet Ti sei mai chiesto come i programmi sul tuo computer e sui siti Web visitati "parlano" tra loro? Per saperne di più (Application Programming Interface) per esportare un oggetto da un programma (chiamato server) e invocare i metodi di quell'oggetto da un altro programma (chiamato client), possibilmente eseguito su un altro computer.

Il Java Registro RMI è un componente chiave del sistema RMI Java e fornisce una directory centralizzata per i server che registrano i servizi e che i clienti possono consultare questi servizi. In questo articolo, impariamo come implementare un server per esporre un oggetto e un client a richiamare un metodo sul server, nonché a registrare e cercare il servizio nel registro RMI.

Dichiarazione dell'interfaccia del server

Per imparare le complessità di come funziona il sistema Java RMI, implementiamo un semplice oggetto server che fornisce un metodo per accettare un nome e restituire un saluto. Ecco la definizione dell'interfaccia dell'oggetto:

import java.rmi.Remote; import java.rmi.RemoteException; interfaccia pubblica Saluto estende Remote public String greet (nome stringa) genera RemoteException;  

Il nome dell'interfaccia è chiamato Saluto. Fornisce un singolo metodo chiamato salutare() che accetta un nome e restituisce un saluto adatto.

Per contrassegnare questa interfaccia come esportabile, è necessario estendere il java.rmi.Remote interfaccia. Anche il metodo deve dichiarare a getta elenco di clausole java.rmi.RemoteException in aggiunta a qualsiasi eccezione specifica per le applicazioni Eccezioni Java: le gestisci correttamente? Eccezioni Java: le gestisci correttamente? Un'eccezione nella programmazione indica una condizione eccezionale nell'esecuzione del programma. È usato quando la condizione può essere gestita meglio altrove. Considera i seguenti esempi di gestione delle eccezioni Java. Leggi di più . In questo modo il codice client può gestire (o propagare) errori di richiamo del metodo remoto come Host non trovato, connessione fallita, eccetera.

Implementazione dell'oggetto server

Dopo aver dichiarato l'interfaccia (che viene utilizzata dai client), implementiamo l'oggetto lato server e forniamo il salutare() metodo come mostrato. Usa una semplice stringa di formato per formattare il saluto.

Accordi di classe pubblica GreetingObject Saluto private String fmtString = "Salve,% s"; public String greet (Nome stringa) return String.format (this.fmtString, name);  

Il metodo principale del server

Cerchiamo ora di riunire tutti questi pezzi insieme e implementare il principale() metodo del server. Passiamo attraverso ciascuno dei passaggi pertinenti.

  • Il primo passo è creare l'implementazione dell'oggetto server.
    Saluto di saluto = nuovo GreetingObject (); 
  • Successivamente, otteniamo uno stub per l'oggetto server dal runtime RMI. Lo stub implementa la stessa interfaccia dell'oggetto server. Tuttavia, il metodo implementa la comunicazione richiesta con l'oggetto server remoto. Questo stub viene utilizzato dal client per invocare in modo trasparente il metodo sull'oggetto server.
    Greeting stub = (Greeting) UnicastRemoteObject.exportObject (greeting, 0); 
  • Una volta ottenuto lo stub, passiamo questo stub al registro RMI per collegarci a un servizio specificato. Quando il client richiede un'implementazione di questo servizio, riceve lo stub che sa come comunicare con l'oggetto server. Di seguito, il metodo statico LocateRegistry.getRegistry () è usato per ottenere il riferimento al registro locale. Il rebind () il metodo viene quindi utilizzato per associare il nome allo stub.
    String name = "Saluto"; Registro di sistema = LocateRegistry.getRegistry (port); registry.rebind (nome, stub); 

Il metodo principale completo.

import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; public class Main static public void main (String [] args) genera 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 = "Saluto"; Saluto di saluto = nuovo GreetingObject (); Greeting stub = (Greeting) UnicastRemoteObject.exportObject (greeting, 0); Registro di sistema = LocateRegistry.getRegistry (port); registry.rebind (nome, stub); System.out.println ("Saluto associato a" "+ nome +" \ "");  

Costruire il server

Cerchiamo ora di costruire il server. Per semplificare le cose, costruiamo usando la riga di comando su Linux invece di usare uno strumento di compilazione come Maven.

Quanto segue compila i file sorgente in file di classe in una directory di destinazione.

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

Raccogli i file di classe in un file JAR per l'esecuzione.

jar cvf target / rmi-server.jar -C server di destinazione 

Raccogliamo anche i file di interfaccia necessari per compilare il client in una libreria JAR.

jar cvf target / rmi-lib.jar -C server di destinazione / Greeting.class 

Implementare il cliente

Cerchiamo ora di implementare il client utilizzato per invocare i metodi dell'oggetto server.

  • Come con il server, ottenere un riferimento al registro, specificando il nome host in cui è in esecuzione il registro e il numero di porta.
    Registro di sistema = LocateRegistry.getRegistry (host, port); 
  • Quindi, cercare il servizio nel registro. Il consultare() metodo restituisce uno stub che può essere utilizzato per invocare servizi.
    Saluto di saluto = (Saluto) registry.lookup (nome); 
  • E invoca il metodo passando gli argomenti richiesti. Qui, otteniamo il saluto passando il nome e stampandolo.
    System.out.println (name + "reported:" + greeting.greet (myName)); 

Il codice cliente completo:

pacchetto client; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import server.Greeting; public class Client static public void main (String [] args) genera Exception if (args.length! = 3) System.err.println ("usage: java Client host port myName"); System.exit (1);  int index = 0; String host = args [index ++]; int port = Integer.parseInt (args [index ++]); String myName = args [indice ++]; String name = "Saluto"; Registro di sistema = LocateRegistry.getRegistry (host, port); Saluto di saluto = (Saluto) registry.lookup (nome); System.out.println (name + "reported:" + greeting.greet (myName));  

Il registro RMI

Lasciaci ora eseguire il programma server in modo che possa iniziare a servire le richieste.

java -cp target / server rmi-server.jar.Main 1099 # genera l'eccezione nel thread "main" java.rmi.ConnectException: connessione rifiutata all'host: xxx; l'eccezione annidata è: java.net.ConnectException: connessione rifiutata 

Qual è questa eccezione Come gestire le eccezioni Java nel modo giusto Come gestire le eccezioni Java nel modo giusto In questo articolo impareremo quali sono le eccezioni Java, perché sono importanti, come usarle e gli errori più comuni da evitare. Leggi di più ? connessione rifiutata.

Il motivo per cui ottieni questa eccezione è dovuto al fatto che: nota dal codice server che tenta di connettersi al registro locale sulla porta 1099. Se fallisce, si finisce con questa eccezione.

La soluzione è eseguire il registro RMI. Il registro RMI è un programma fornito con Java Virtual Machine e viene chiamato rmiregistry. Dovrebbe essere situato nel bidone directory dell'installazione Java Virtual Machine. Eseguirlo è semplice come:

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

Per impostazione predefinita, il registro è in ascolto sulla porta 1099. Per farlo ascoltare su un'altra porta, specificare il numero di porta come segue:

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

Verificare che ci sia effettivamente un listener alla porta specificata con il comando netstat 8 Comandi CMD per gestire reti (wireless) in Windows 8 Comandi CMD per gestire reti (wireless) in Windows Se si desidera il controllo completo e assoluto sulla rete, allora Dovrò iniziare a usare il prompt dei comandi. Ecco i comandi più utili per la gestione e la risoluzione dei problemi della rete domestica. Leggi di più :

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

Esecuzione del server

Cerchiamo ora di eseguire nuovamente il server.

java -cp target / server rmi-server.jar.Main 1100 # genera java.rmi.UnmarshalException: errore argomenti di rimozione automatica ... Causato da: java.lang.ClassNotFoundException: server.Greeting ... 

Ancora un'eccezione! Cos'è questa volta??

Il server non è in grado di caricare la classe di interfaccia server.Greeting. Ciò accade perché il Registro di sistema RMI non è in grado di caricare la classe richiesta. Quindi è necessario specificare la posizione delle classi richieste. Un modo per farlo è specificare la variabile di ambiente CLASSPATH:

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

Cercando di eseguire nuovamente il server offre:

java -cp target / server rmi-server.jar.Main 1100 # stampa Saluto associato a "Saluto" 

Ora il server è in esecuzione.

Esecuzione del client

Dopo che tutte le parti sono state assemblate ed eseguite, l'esecuzione del client è semplice. Ha bisogno dei JAR appropriati per l'esecuzione. Questi includono la classe contenente il principale() metodo e la classe di interfaccia. Accetta argomenti che indicano dove è in esecuzione il registro RMI e un nome per il saluto.

java -cp target / rmi-client.jar: target / rmi-lib.jar client.Client localhost 1100 Peter # prints Saluti segnalati: Hello, Peter 

Sommario

Java RMI fornisce un'API e strumenti per semplificare l'esecuzione di codice in modalità remota. È possibile implementare un server che registri un oggetto servizio con il registro Java RMI. I client possono interrogare il registro e ottenere lo stub dell'oggetto di servizio per richiamare i metodi di servizio. Come illustra questo esempio, è tutto abbastanza semplice.

Stai usando Java RMI nel tuo progetto? Qual è stata la tua esperienza? Ci sono delle alternative che hai studiato? Per favore fateci sapere nei commenti qui sotto.

Scopri di più su: Java.