Sve o Java RMI registru i kako ga koristiti

Sve o Java RMI registru i kako ga koristiti

RMI stoji za pozivanje udaljene metode i, kao što naziv govori, protokol je za Java program da pozove metodu objekta koji se izvodi na drugom računalu. Pruža API (sučelje aplikacijskog programiranja) za izvoz objekta iz jednog programa (koji se naziva poslužitelj) i pozivanje metoda tog objekta iz drugog programa (zvanog klijent), moguće izvođenje na drugom računalu.





Java RMI registar je ključna komponenta Java RMI sustava i pruža centralizirani direktorij za poslužitelje za registraciju usluga i za klijente za traženje tih usluga. U ovom članku učimo kako implementirati poslužitelj za izlaganje objekta i klijenta da pozove metodu na poslužitelju, kao i registraciju i traženje usluge u registru RMI.





kako prenijeti datoteke između google računa računa

Deklariranje poslužiteljskog sučelja

Da bismo naučili zamršenost funkcioniranja Java RMI sustava, implementirajmo jednostavan objekt poslužitelja koji pruža način prihvaćanja imena i uzvraćanja pozdrava. Evo definicije sučelja objekta:





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

Naziva se ime sučelja Pozdrav . Pruža jednu metodu tzv pozdraviti() koja prihvaća ime i uzvraća odgovarajući pozdrav.

Da bi se ovo sučelje označilo kao izvozno, potrebno je proširiti java.rmi.Daljinski sučelje. Također metoda mora deklarirati a baca navođenje klauzule java.rmi.RemoteException uz sve iznimke specifične za aplikaciju. Tako klijentov kôd može obraditi (ili proširiti) pogreške pri dozivanju udaljene metode, npr domaćin nije pronađen , veza-kvar itd.



Implementacija poslužiteljskog objekta

Nakon deklariranja sučelja (koje koriste klijenti), implementiramo objekt na strani poslužitelja i pružamo pozdraviti() metoda kako je prikazano. Za oblikovanje pozdrava koristi niz jednostavnog formata.

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

Glavna metoda poslužitelja

Hajdemo sada zajedno spojiti sve ove dijelove i implementirati glavni() način poslužitelja. Prođimo kroz svaki od relevantnih koraka.





  • Prvi korak je stvaranje implementacije poslužiteljskog objekta. | _+_ |
  • Zatim dobivamo stub za poslužiteljski objekt iz vremena izvođenja RMI -a. Stub implementira isto sučelje kao objekt poslužitelja. Međutim, metoda provodi potrebnu komunikaciju s objektom udaljenog poslužitelja. Ovaj stub klijent koristi za transparentno dozivanje metode na poslužiteljskom objektu. | _+_ |
  • Nakon što se dobije stub, predajemo ga u RMI registar za povezivanje s navedenom imenovanom uslugom. Kada klijent zatraži implementaciju ove usluge, prima stub koji zna komunicirati s poslužiteljskim objektom. U nastavku slijedi statička metoda LocateRegistry.getRegistry () koristi se za dobivanje reference lokalnog registra. The rebind () metoda se zatim koristi za vezanje imena na stub. | _+_ |

Cjelovita glavna metoda.

Greeting greeting = new GreetingObject();

Izgradnja poslužitelja

Pogledajmo sada izgradnju poslužitelja. Da pojednostavimo stvari, gradimo pomoću naredbenog retka na Linuxu, a ne pomoću alata za izgradnju, poput Mavena.





U nastavku se kompiliraju izvorne datoteke u datoteke razreda u ciljnom direktoriju.

Greeting stub = (Greeting)UnicastRemoteObject.exportObject(greeting, 0);

Prikupite datoteke klase u JAR datoteku za izvršavanje.

String name = 'Greeting';
Registry registry = LocateRegistry.getRegistry(port);
registry.rebind(name, stub);

Također prikupljamo datoteke sučelja potrebne za sastavljanje klijenta u JAR knjižnice.

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 + ''');
}
}

Implementacija Klijenta

Pogledajmo sada implementaciju klijenta koji se koristi za dozivanje metoda poslužiteljskog objekta.

  • Kao i kod poslužitelja, potražite referencu u registru, navodeći ime hosta na kojem je registar pokrenut i broj porta. | _+_ |
  • Zatim potražite uslugu u registru. The Pogledaj() method vraća stub koji se može koristiti za pozivanje usluga. | _+_ |
  • Pozovite metodu prosljeđujući potrebne argumente. Ovdje dobivamo pozdrav prosljeđujući ime i ispisujući ga. | _+_ |

Potpuni klijentski kod:

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

Registar RMI

Pokrenimo sada poslužiteljski program kako bi mogao početi posluživati ​​zahtjeve.

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

Što je ova iznimka ? Veza je odbijena .

Razlog zašto ste dobili ovu iznimku je sljedeći: zabilježite iz koda poslužitelja da se pokušava povezati s lokalnim registrom na portu 1099. Ako to ne uspije, završit ćete s ovom iznimkom.

Rješenje je pokretanje registra RMI. RMI registar je program isporučen s Java virtualnim strojem i naziva se rmiregistar . Trebao bi se nalaziti u am direktorij instalacije Java Virtual Machine. Pokretanje je jednostavno kao:

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

Registar prema zadanim postavkama sluša na portu 1099. Da biste ga poslušali na drugom portu, navedite broj porta na sljedeći način:

Registry registry = LocateRegistry.getRegistry(host, port);

Provjerite ima li doista slušatelja na navedenom priključku s naredba netstat :

najbolja aplikacija za gledanje fotografija za Windows 10
Greeting greeting = (Greeting) registry.lookup(name);

Pokretanje poslužitelja

Pokušajmo sada ponovo pokrenuti poslužitelj.

System.out.println(name + ' reported: ' + greeting.greet(myName));

Opet iznimka! Što je ovaj put?

Poslužitelj ne može učitati klasu sučelja poslužitelj.Pozdrav . To se događa jer RMI registar ne može učitati potrebnu klasu. Stoga morate navesti mjesto potrebnih klasa. Jedan od načina za to je navođenje varijable okruženja CLASSPATH:

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));
}
}

Pokušaj ponovnog pokretanja poslužitelja daje:

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

Sada poslužitelj radi.

Pokretanje klijenta

Nakon što su svi dijelovi sastavljeni i izvedeni, pokretanje klijenta je jednostavno. Za izvođenje su mu potrebni odgovarajući JAR -ovi. To uključuje klasu koja sadrži glavni() metoda i klasa sučelja. Prihvaća argumente koji pokazuju gdje je pokrenut RMI registar i naziv pozdrava.

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

Sažetak

Java RMI pruža API i alate za lakše izvršavanje udaljenog koda. Možete implementirati poslužitelj koji registrira objekt usluge u Java RMI registru. Klijenti mogu postaviti upit registru i dobiti stub uslužnog objekta za pozivanje metoda usluge. Kao što ovaj primjer ilustrira, sve je vrlo jednostavno.

Koristite li Java RMI u svom projektu? Kakvo je vaše iskustvo? Postoje li alternative koje ste istražili? Molimo vas da nas obavijestite u komentarima ispod.

Udio Udio Cvrkut E -pošta Vodič za animaciju govora za početnike

Oživljavanje govora može biti izazov. Ako ste spremni započeti dodavanje dijaloga u svoj projekt, mi ćemo za vas razbiti postupak.

Pročitajte Dalje
Povezane teme
  • Programiranje
  • Java
O autoru Jay Sridhar(17 objavljenih članaka) Više od Jaya Sridhara

Pretplatite se na naše obavijesti

Pridružite se našem biltenu za tehničke savjete, recenzije, besplatne e -knjige i ekskluzivne ponude!

Kliknite ovdje za pretplatu