Viskas apie „Java RMI“ registrą ir kaip juo naudotis

Viskas apie „Java RMI“ registrą ir kaip juo naudotis

RMI reiškia iškvietimas nuotoliniu būdu ir, kaip rodo pavadinimas, yra „Java“ programos protokolas, skirtas iškviesti kitame kompiuteryje veikiančio objekto metodą. Jame yra API (taikomųjų programų programavimo sąsaja), skirta eksportuoti objektą iš vienos programos (vadinamos serveriu) ir panaudoti to objekto metodus iš kitos programos (vadinamos klientu), galbūt veikiančia kitame kompiuteryje.





„Java“ RMI registras yra pagrindinis „Java RMI“ sistemos komponentas ir suteikia centralizuotą katalogą serveriams registruoti paslaugas ir klientams ieškoti šių paslaugų. Šiame straipsnyje mes mokomės, kaip įdiegti serverį, kad objektas būtų atskleistas, o klientas, norėdamas iškviesti metodą serveryje, taip pat registruoti ir ieškoti paslaugos RMI registre.





kaip žodžiu pridėti čikago stiliaus išnašas

Serverio sąsajos deklaravimas

Norėdami sužinoti, kaip veikia „Java RMI“ sistema, įdiekime paprastą serverio objektą, kuris suteikia metodą vardui priimti ir sveikinimui grąžinti. Čia yra objekto sąsajos apibrėžimas:





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

Sąsajos pavadinimas vadinamas Sveikinimai . Jis pateikia vieną metodą, vadinamą sveikinu () kuris priima vardą ir grąžina tinkamą sveikinimą.

Kad ši sąsaja būtų pažymėta kaip eksportuojama, ji turi būti išplėsta java.rmi. Nuotolinis sąsaja. Taip pat metodu reikia deklaruoti a meta punktų sąrašas java.rmi.RemoteException be konkrečių taikymo išimčių. Taip kliento kodas gali apdoroti (arba platinti) nuotolinio metodo iškvietimo klaidas, tokias kaip šeimininkas-nerastas , ryšys-gedimas ir kt.



Serverio objekto įgyvendinimas

Paskelbę sąsają (kuria naudojasi klientai), mes įgyvendiname serverio pusės objektą ir pateikiame sveikinu () metodas, kaip parodyta. Sveikinimui formatuoti naudojama paprasto formato eilutė.

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

Pagrindinis serverio metodas

Dabar apžvelkime visas šias dalis kartu ir įgyvendinkime pagrindinis () serverio metodas. Leiskite mums pereiti kiekvieną atitinkamą žingsnį.





  • Pirmasis žingsnis yra sukurti serverio objekto įgyvendinimą. | _+_ |
  • Toliau iš RMI vykdymo laiko gauname serverio objekto trūkumą. Stubas įgyvendina tą pačią sąsają kaip ir serverio objektas. Tačiau metodas įgyvendina reikiamą ryšį su nuotolinio serverio objektu. Šią atotrūkį klientas naudoja skaidriai iškviesti metodą serverio objekte. | _+_ |
  • Gavę atotrūkį, mes perduodame jį į RMI registrą, kad jis susietų su nurodyta paslauga. Kai klientas prašo įdiegti šią paslaugą, jis gauna atotrūkį, kuris žino, kaip bendrauti su serverio objektu. Toliau pateikiamas statinis metodas LocateRegistry.getRegistry () naudojamas norint gauti vietinio registro nuorodą. The perrišti () tada metodas naudojamas pavadinimui susieti su stuburu. | _+_ |

Visas pagrindinis metodas.

Greeting greeting = new GreetingObject();

Serverio kūrimas

Dabar pažvelkime į serverio kūrimą. Kad viskas būtų paprasta, mes kuriame naudodami komandinę eilutę „Linux“, o ne naudodami kūrimo įrankį, pvz., „Maven“.





Toliau išvardyti šaltinio failai surenkami į tiksliniame kataloge esančius klasės failus.

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

Surinkite klasės failus į JAR failą vykdymui.

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

Mes taip pat renkame sąsajos failus, reikalingus klientui surinkti į biblioteką JAR.

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

Kliento įgyvendinimas

Dabar pažvelkime į kliento, naudojamo serverio objekto metodams iškviesti, įgyvendinimą.

  • Kaip ir serveryje, gaukite nuorodą į registrą, nurodydami pagrindinio kompiuterio pavadinimą, kuriame veikia registras, ir prievado numerį. | _+_ |
  • Tada ieškokite paslaugos registre. The ieškoti () metodas grąžina atotrūkį, kuris gali būti naudojamas paslaugoms iškviesti. | _+_ |
  • Ir pasinaudokite metodu perduodami reikiamus argumentus. Čia mes gauname sveikinimą perduodami vardą ir išspausdinę. | _+_ |

Pilnas kliento kodas:

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

RMI registras

Dabar paleiskite serverio programą, kad ji galėtų pradėti teikti užklausas.

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

Kas yra ši išimtis ? Ryšys atmestas .

Šios išimties priežastis yra ta, kad: iš serverio kodo atkreipkite dėmesį, kad jis bando prisijungti prie 1099 prievado vietinio registro. Jei nepavyksta, galiausiai turite šią išimtį.

Sprendimas yra paleisti RMI registrą. RMI registras yra programa, pristatoma kartu su „Java“ virtualia mašina ir vadinama rmiregistry . Jis turėtų būti esu „Java“ virtualios mašinos diegimo katalogą. Vykdyti tai taip paprasta, kaip:

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

Pagal numatytuosius nustatymus registras klauso 1099 prievado. Jei norite, kad jis būtų klausomas kitame prievade, nurodykite prievado numerį taip:

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

Patikrinkite, ar nurodytame prievade tikrai yra klausytojas komanda „netstat“ :

kaip padidinti skirtą vaizdo įrašų intel hd grafiką
Greeting greeting = (Greeting) registry.lookup(name);

Vykdomas serveris

Dabar pabandykime paleisti serverį dar kartą.

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

Vėl išimtis! Kas tai šį kartą?

Serveris negali įkelti sąsajos klasės serveris.Sveikinimas . Taip atsitinka todėl, kad RMI registras negali įkelti reikiamos klasės. Taigi reikia nurodyti reikiamų klasių vietą. Vienas iš būdų tai padaryti yra nurodyti aplinkos kintamąjį 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));
}
}

Bandant paleisti serverį dar kartą, gaunama:

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

Dabar serveris veikia.

Kliento paleidimas

Surinkus ir vykdant visas dalis, kliento paleidimas yra paprastas. Jai vykdyti reikia atitinkamų JAR. Tai apima klasę, kurioje yra pagrindinis () metodas ir sąsajos klasė. Ji priima argumentus, nurodančius, kur veikia RMI registras, ir sveikinimo pavadinimą.

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

Santrauka

„Java RMI“ teikia API ir įrankius, palengvinančius nuotolinio kodo vykdymą. Galite įdiegti serverį, kuris registruoja paslaugos objektą „Java RMI“ registre. Klientai gali užklausti registro ir gauti paslaugos objekto atotrūkį, kad galėtų pasinaudoti aptarnavimo metodais. Kaip rodo šis pavyzdys, viskas yra gana paprasta.

Ar savo projekte naudojate „Java RMI“? Kokia buvo jūsų patirtis? Ar yra kokių nors alternatyvų, kurias ištyrėte? Praneškite mums toliau pateiktose pastabose.

Dalintis Dalintis „Tweet“ Paštu Kalbos animacijos vadovas pradedantiesiems

Kalbos animacija gali būti iššūkis. Jei būsite pasirengę pradėti dialogą prie savo projekto, mes suskaidysime procesą už jus.

Skaityti toliau
Susijusios temos
  • Programavimas
  • „Java“
Apie autorių Jay Sridhar(Paskelbti 17 straipsnių) Daugiau iš Jay Sridhar

Prenumeruokite mūsų naujienlaiškį

Prisijunkite prie mūsų naujienlaiškio, kad gautumėte techninių patarimų, apžvalgų, nemokamų el. Knygų ir išskirtinių pasiūlymų!

Norėdami užsiprenumeruoti, spustelėkite čia