Totul despre registrul Java RMI și modul de utilizare a acestuia

Totul despre registrul Java RMI și modul de utilizare a acestuia / Programare

RMI standuri pentru invocarea metodei la distanță și, după cum indică și numele, este un protocol pentru un program Java de a invoca o metodă a unui obiect care rulează pe un alt computer. Acesta oferă un API Ce sunt API-urile și cum sunt API-urile deschise Schimbarea internetului Ce sunt API-urile și cum sunt API-urile deschise Schimbarea internetului V-ați întrebat vreodată cum se programează programele de pe computerul dvs. și de pe site-urile web pe care le vizitați "vorbesc" reciproc? Citiți mai mult (Interfață de programare a aplicațiilor) pentru a exporta un obiect dintr-un program (numit server) și pentru a invoca metodele acelui obiect dintr-un alt program (numit client), care poate fi rulat pe un alt computer.

Java Registrul RMI este o componentă cheie a sistemului Java RMI și oferă un director centralizat pentru ca serverele să înregistreze servicii și clienții să caute aceste servicii. În acest articol, învățăm cum să implementăm un server pentru a expune un obiect și un client pentru a invoca o metodă pe server, precum și pentru a înregistra și a căuta serviciul în registrul RMI.

Declararea interfeței serverului

Pentru a afla cum funcționează sistemul Java RMI, permiteți-ne să implementăm un obiect de server simplu care să ofere o metodă de acceptare a unui nume și de returnare a unui mesaj de salut. Iată definiția interfeței obiect:

import java.rmi.Remote; import java.rmi.RemoteException; interfața publică Salutul se extinde la distanță public String greet (String name) aruncă RemoteException;  

Se numește numele interfeței Salut. Acesta oferă o singură metodă numită salut () care acceptă un nume și returnează un salut potrivit.

Pentru a marca această interfață ca fiind exportabilă, trebuie extinsă java.rmi.Remote interfață. De asemenea, metoda trebuie să declare a aruncă listarea clauzelor java.rmi.RemoteException în plus față de orice excepții specifice aplicații Java Excepții: Ești manipularea lor dreapta? Excepții Java: Îi manipulezi corect? O excepție în programare înseamnă o condiție excepțională în execuția programului. Este folosit atunci când condiția poate fi tratată mai bine în altă parte. Luați în considerare următoarele exemple de manipulare a excepțiilor Java. Citeste mai mult . Acest lucru este astfel încât codul client poate gestiona (sau propaga) erori de invocare a metodei la distanță, cum ar fi gazda de negasit, conexiune eșec, etc.

Implementarea obiectului serverului

După declararea interfeței (care este utilizată de clienți), implementăm obiectul de pe server și oferim salut () așa cum se arată. Utilizează un șir de format simplu pentru a formata salutul.

clasa publică GreetingObject implementează felicitarea private String fmtString = "Bună ziua,% s"; public String greet (Nume șir) return String.format (this.fmtString, nume);  

Metoda principală a serverului

Să alcătuim acum toate aceste piese împreună și să le punem în aplicare principal() metoda serverului. Să trecem prin fiecare dintre etapele relevante.

  • Primul pas este de a crea implementarea obiectului de server.
    Salut salut = nou GreetingObject (); 
  • Apoi, obținem un stub pentru obiectul server din timpul de execuție RMI. Stub-ul implementează aceeași interfață ca și obiectul serverului. Cu toate acestea, metoda implementează comunicarea necesară cu obiectul serverului de la distanță. Acest stub este utilizat de client pentru a invoca în mod transparent metoda pe obiectul serverului.
    Paste de salut = (Salut) UnicastRemoteObject.exportObject (salut, 0); 
  • Odată ce a fost obținut stub, vom înmâna acest stub către registrul RMI pentru a se lega de un anumit serviciu numit. Atunci când clientul cere o implementare a acestui serviciu, acesta primește stub-ul care știe să comunice cu obiectul serverului. În cele ce urmează, metoda statică LocateRegistry.getRegistry () este utilizat pentru a obține referința la registrul local. rebind () Metoda este apoi utilizată pentru a lega numele în stub.
    Nume șir = "Salut"; Registrul de registru = LocateRegistry.getRegistry (port); registry.rebind (nume, stub); 

Metoda principală completă.

import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; clasa publica principala static public void main (String [] args) arunca exceptia if (args.length == 0) System.err.println ("use: java Port principal"); System.exit (1);  int index = 0; int port = Integer.parseInt (args [index ++]); Nume șir = "Salut"; Salut salut = nou GreetingObject (); Paste de salut = (Salut) UnicastRemoteObject.exportObject (salut, 0); Registrul de registru = LocateRegistry.getRegistry (port); registry.rebind (nume, stub); System.out.println ("Salut obligat la \" "+ nume +" \ "");  

Construirea serverului

Să analizăm acum construirea serverului. Pentru a păstra lucrurile simple, construim folosind linia de comandă pe Linux mai degrabă decât folosind un instrument de construcție, cum ar fi Maven.

Următoarele compilă fișierele sursă la fișierele de clasă dintr-un director țintă.

rm -rf țintă mkdir țintă javac -d țintă src / server / *. java 

Colectați fișierele de clasă într-un fișier JAR pentru execuție.

jar cvf target / rmi-server.jar -C server-țintă 

Colectăm, de asemenea, fișierele de interfață necesare pentru compilarea clientului într-o bibliotecă JAR.

jar cvf target / rmi-lib.jar -C serverul țintă / Greeting.class 

Implementarea Clientului

Să analizăm acum implementarea clientului folosit pentru invocarea metodelor server object.

  • Ca și în cazul serverului, obțineți o referință la registru, specificând numele gazdei în care rulează registrul și numărul portului.
    Registrul de registru = LocateRegistry.getRegistry (gazdă, port); 
  • Apoi, căutați serviciul în registru. privește în sus() metoda returnează un stub care poate fi folosit pentru invocarea serviciilor.
    Salut de salut = (Salut) registry.lookup (nume); 
  • Și invocați metoda de transmitere a argumentelor necesare. Aici, primim salutul prin trecerea numelui și imprimarea acestuia.
    System.out.println (nume + "raportat:" + greeting.greet (myName)); 

Codul complet al clientului:

pachet client; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; server import.Greeting; clasa publica Clientul static public void main (String [] args) arunca Exceptie if (args.length! = 3) System.err.println ("use: portul client java Client myName"); System.exit (1);  int index = 0; String gazdă = args [index ++]; int port = Integer.parseInt (args [index ++]); String myName = args [index ++]; Nume șir = "Salut"; Registrul de registru = LocateRegistry.getRegistry (gazdă, port); Salut de salut = (Salut) registry.lookup (nume); System.out.println (nume + "raportat:" + greeting.greet (myName));  

Registrul RMI

Să rulați acum programul de server pentru a putea începe să difuzeze cererile.

java-cp target / rmi-server.jar server.Main 1099 # aruncă Excepție în firul "principal" java.rmi.ConnectException: Conexiunea a refuzat să găzduiască: xxx; excepția imbricată este: java.net.ConnectException: Conexiunea a fost refuzată 

Ce este această excepție Cum de a trata excepțiile Java pe calea cea bună Cum să se ocupe de excepțiile Java pe calea cea bună În acest articol, veți afla ce excepții Java sunt, de ce sunt importante, cum să le utilizați și greșeli comune de evitat. Citeste mai mult ? conexiune refuzata.

Motivul pentru care obțineți această excepție este că: Notați din codul serverului că încearcă să se conecteze la registrul local pe portul 1099. Dacă aceasta nu reușește, veți sfârși cu această excepție.

Soluția este de a rula Registrul RMI. Registrul RMI este un program livrat cu mașina virtuală Java și este numit rmiregistry. Ar trebui să fie localizat în cos director al instalării Java Virtual Machine. Rularea este la fel de simplă:

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

În mod implicit, registrul ascultă pe portul 1099. Pentru a-l asculta pe un alt port, specificați numărul portului după cum urmează:

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

Verificați dacă există într-adevăr un ascultător la portul specificat cu comanda netstat 8 CMD Comenzi pentru administrarea rețelelor (wireless) în Windows 8 Comenzi CMD pentru administrarea rețelelor (wireless) în Windows Dacă doriți un control complet și absolut asupra rețelei, atunci va trebui să încep să folosesc Command Prompt. Iată cele mai utile comenzi pentru gestionarea și depanarea rețelei de domiciliu. Citeste mai mult :

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

Rularea serverului

Să încercăm acum să rulez din nou serverul.

java-cp target / rmi-server.jar server.Main 1100 # aruncă java.rmi.UnmarshalException: eroare de marcare a argumentelor ... Cauză: java.lang.ClassNotFoundException: server.Greeting ... 

O excepție din nou! Ce este de data asta??

Serverul nu poate încărca clasa de interfață server.Greeting. Acest lucru se întâmplă deoarece Registrul RMI nu poate încărca clasa necesară. Deci, trebuie să specificați locația clasei necesare. O modalitate de a face acest lucru este să specificați variabila de mediu CLASSPATH:

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

Încercarea de a rula din nou serverul oferă:

java-cp target / rmi-server.jar server.Main 1100 # tipărite Salut obligat la "Salut" 

Acum serverul rulează.

Rularea clientului

După ce toate piesele sunt asamblate și executate, executarea clientului este simplă. Ea are nevoie de JAR-urile corespunzătoare pentru execuție. Acestea includ clasa care conține principal() metoda și clasa de interfață. Acceptă argumente care indică locul în care rulează registrul RMI și un nume pentru salut.

java-cp target / rmi-client.jar: țintă / rmi-lib.jar client.Client localhost 1100 Peter # tipărite Felicitare raportată: Bună, Peter 

rezumat

Java RMI oferă un API și instrumente pentru a facilita executarea codului la distanță. Puteți implementa un server care înregistrează un obiect serviciu cu Java RMI Registry. Clienții pot interoga regiștrii și pot obține stub de obiect serviciu pentru a invoca metodele de serviciu. După cum ilustrează acest exemplu, este foarte simplu.

Utilizați Java RMI în proiectul dvs.? Care a fost experiența dvs.? Există variante pe care le-ați investigat? Spuneți-ne în comentariile de mai jos.

Explorați mai multe despre: Java.