Totul despre registrul Java RMI și modul de utilizare

Totul despre registrul Java RMI și modul de utilizare

RMI înseamnă invocarea metodei la distanță și, așa cum indică și numele, este un protocol pentru un program Java pentru a invoca o metodă a unui obiect care rulează pe un alt computer. Acesta oferă un API (Interfață de programare a aplicațiilor) pentru exportul unui obiect dintr-un program (numit server) și invocarea metodelor acelui obiect dintr-un alt program (numit client), care poate rula pe un computer diferit.





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





cum se conectează wii la hdmi

Declararea interfeței serverului

Pentru a afla complexitatea modului în care funcționează sistemul Java RMI, permiteți-ne să implementăm un obiect server simplu care oferă o metodă de acceptare a unui nume și returnarea unui mesaj de salut. Iată definiția interfeței obiectului:





import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Greeting extends Remote
{
public String greet(String name) throws RemoteException;
}

Numele interfeței se numește Salut . Oferă o singură metodă numită salut () care acceptă un nume și returnează un salut potrivit.

Pentru a marca această interfață ca exportabilă, trebuie să extindă fișierul java.rmi.Remote interfață. De asemenea, metoda trebuie să declare a aruncă listarea clauzelor java.rmi.RemoteException pe lângă orice excepție specifică aplicației. Aceasta este astfel încât codul clientului să poată gestiona (sau să propage) erori de invocare a metodelor la distanță, cum ar fi gazda de negasit , conexiune-eșec , etc.



Implementarea obiectului server

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

public class GreetingObject implements Greeting
{
private String fmtString = 'Hello, %s';
public String greet(String name)
{
return String.format(this.fmtString, name);
}
}

Metoda principală a serverului

Să adunăm acum toate aceste piese împreună și să implementăm principal() metoda serverului. Să parcurgem fiecare dintre pașii relevanți.





  • Primul pas este crearea implementării obiectului server. Greeting greeting = new GreetingObject();
  • Apoi, obținem un stub pentru obiectul server din timpul de execuție RMI. Butonul implementează aceeași interfață ca obiectul server. Totuși, metoda implementează comunicarea necesară cu obiectul server de la distanță. Acest butuc este utilizat de client pentru a invoca în mod transparent metoda obiectului server. Greeting stub = (Greeting)UnicastRemoteObject.exportObject(greeting, 0);
  • Odată obținut stub-ul, îl predăm registrului RMI pentru a-l lega la un serviciu specificat. Când clientul solicită o implementare a acestui serviciu, primește stub-ul care știe cum să comunice cu obiectul server. În cele ce urmează, metoda statică LocateRegistry.getRegistry () este utilizat pentru a obține referința de registru local. The rebind () metoda este apoi utilizată pentru a lega numele de stub. String name = 'Greeting';
    Registry registry = LocateRegistry.getRegistry(port);
    registry.rebind(name, stub);

Metoda principală completă.

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
public class Main
{
static public void main(String[] args) throws 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 = 'Greeting';
Greeting greeting = new GreetingObject();
Greeting stub = (Greeting)UnicastRemoteObject.exportObject(greeting, 0);
Registry registry = LocateRegistry.getRegistry(port);
registry.rebind(name, stub);
System.out.println('Greeting bound to '' + name + ''');
}
}

Construirea serverului

Să analizăm acum construirea serverului. Pentru a simplifica lucrurile, construim folosind linia de comandă pe Linux, mai degrabă decât folosind un instrument de construire, cum ar fi Maven.





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

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

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

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

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

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

Implementarea Clientului

Să analizăm acum implementarea clientului utilizat pentru invocarea metodelor obiectului server.

  • Ca și în cazul serverului, obțineți o referință la registru, specificând numele gazdei unde rulează registrul și numărul portului. Registry registry = LocateRegistry.getRegistry(host, port);
  • Apoi, căutați serviciul în registru. The privește în sus() metoda returnează un stub care poate fi utilizat pentru apelarea serviciilor. Greeting greeting = (Greeting) registry.lookup(name);
  • Și invocați metoda trecând argumentele necesare. Aici, primim salutul trecând numele și imprimându-l. System.out.println(name + ' reported: ' + greeting.greet(myName));

Codul client complet:

package client;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import server.Greeting;
public class Client
{
static public void main(String[] args) throws 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[index++];
String name = 'Greeting';
Registry registry = LocateRegistry.getRegistry(host, port);
Greeting greeting = (Greeting) registry.lookup(name);
System.out.println(name + ' reported: ' + greeting.greet(myName));
}
}

Registrul RMI

Permiteți-ne să rulăm acum programul server, astfel încât să poată începe să servească cereri.

java -cp target/rmi-server.jar server.Main 1099
# throws
Exception in thread 'main' java.rmi.ConnectException: Connection refused to host: xxx; nested exception is:
java.net.ConnectException: Connection refused

Ce este această excepție ? Conexiune refuzată .

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

Soluția este să rulați registrul RMI. Registrul RMI este un program livrat împreună cu mașina virtuală Java și se numește rmiregistry . Ar trebui să fie amplasat în a.m directorul instalării mașinii virtuale Java. Rularea acestuia este la fel de simplă ca:

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

În mod implicit, registrul ascultă 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 :

cum să prinzi pe cineva care ascunde în telefonul tău Android
netstat -an -t tcp -p | grep LISTEN
...
tcp6 0 0 :::1100 :::* LISTEN 23450/rmiregistry

Rularea serverului

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

java -cp target/rmi-server.jar server.Main 1100
# throws
java.rmi.UnmarshalException: error unmarshalling arguments
...
Caused by: java.lang.ClassNotFoundException: server.Greeting
...

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

Serverul nu poate încărca clasa de interfață server.Salutare . Acest lucru se întâmplă deoarece Registrul RMI nu poate încărca clasa necesară. Deci, trebuie să specificați locația claselor 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
# prints
Greeting bound to 'Greeting'

Acum serverul rulează.

Rularea clientului

După ce toate piesele sunt asamblate și executate, rularea clientului este simplă. Are nevoie de JAR-uri adecvate pentru executare. Acestea includ clasa care conține principal() metoda și clasa de interfață. Acceptă argumente care indică unde rulează registrul RMI și un nume pentru salut.

java -cp target/rmi-client.jar:target/rmi-lib.jar client.Client localhost 1100 Peter
# prints
Greeting reported: Hello, 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 de serviciu în Registrul Java RMI. Clienții pot interoga registrul și pot obține stub de obiect de serviciu pentru invocarea metodelor de serviciu. După cum ilustrează acest exemplu, totul este destul de simplu.

Folosiți Java RMI în proiectul dvs.? Care a fost experiența ta? Există alternative pe care le-ați investigat? Vă rugăm să ne anunțați în comentariile de mai jos.

Acțiune Acțiune Tweet E-mail Un ghid pentru începători pentru vorbirea animată

Animarea vorbirii poate fi o provocare. Dacă sunteți gata să începeți să adăugați dialog la proiectul dvs., vom descompune procesul pentru dvs.

Citiți în continuare
Subiecte asemănătoare
  • Programare
  • Java
Despre autor Jay Sridhar(17 articole publicate) Mai multe de la Jay Sridhar

Aboneaza-te la newsletter-ul nostru

Alăturați-vă newsletter-ului pentru sfaturi tehnice, recenzii, cărți electronice gratuite și oferte exclusive!

Faceți clic aici pentru a vă abona