Kõik Java RMI registri ja selle kasutamise kohta

Kõik Java RMI registri ja selle kasutamise kohta

RMI tähistab kaugmeetodil kutsumine ja nagu nimigi ütleb, on see Java -programmi protokoll, mis käivitab teises arvutis töötava objekti meetodi. See pakub API -d (rakendusprogrammeerimisliides) objekti eksportimiseks ühest programmist (nn server) ja selle objekti meetodite käivitamiseks teisest programmist (mida nimetatakse kliendiks), mis võib -olla töötab teises arvutis.





Java RMI register on Java RMI süsteemi põhikomponent ja pakub tsentraliseeritud kataloogi serveritele teenuste registreerimiseks ja klientidele nende teenuste otsimiseks. Sellest artiklist õpime, kuidas rakendada serverit objekti paljastamiseks ja kliendil meetodit serveris esile kutsuda, samuti registreerida ja otsida teenust RMI registrist.





voogesitage telefonist telerisse usb abil

Serveri liidese deklareerimine

Java RMI süsteemi toimimise keerukuse tundmaõppimiseks rakendame lihtsa serveriobjekti, mis pakub meetodi nime aktsepteerimiseks ja tervituse tagastamiseks. Siin on objekti liidese määratlus:





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

Liidese nime nimetatakse Tervitades . See pakub ühte meetodit, mida nimetatakse tervitan () mis aktsepteerib nime ja tagastab sobiva tervituse.

Selle liidese eksporditavaks märkimiseks peab see laiendama java.rmi.Kaugjuhtimispult liides. Samuti tuleb meetodil deklareerida a viskab klausli loetelu java.rmi.RemoteException Lisaks rakendusepõhistele eranditele. See on nii, et kliendikood saab hakkama (või levitada) kaugmeetodi kutsumisvigu, näiteks host-not-found , ühendus-rike , jne.



Serveriobjekti juurutamine

Pärast liidese (mida kliendid kasutavad) deklareerimist rakendame serveripoolse objekti ja esitame tervitan () meetod nagu näidatud. See kasutab tervituse vormindamiseks lihtsat vormingustringi.

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

Serveri peamine meetod

Nüüd koondame kõik need osad kokku ja rakendame peamine () serveri meetod. Lähme läbi kõik asjakohased sammud.





  • Esimene samm on serveriobjekti teostuse loomine. | _+_ |
  • Järgmisena saame RMI käitusajalt serveriobjekti jaoks tüki. Tükk rakendab sama liidest nagu serveri objekt. Kuid meetod rakendab nõutavat suhtlust kaugserveri objektiga. Seda tüki kasutab klient meetodil läbipaistvalt serveriobjektil käivitamiseks. | _+_ |
  • Kui tükk on saadud, anname selle tüki üle RMI registrile, et siduda see nimega teenusega. Kui klient soovib selle teenuse rakendamist, saab ta tühiku, mis teab, kuidas serveriobjektiga suhelda. Järgnevalt staatiline meetod LocateRegistry.getRegistry () kasutatakse kohaliku registri viite saamiseks. The mässama () Seejärel kasutatakse nime sidumiseks tükiga meetodit. | _+_ |

Täielik peamine meetod.

Greeting greeting = new GreetingObject();

Serveri ehitamine

Vaatame nüüd serveri loomist. Asjade lihtsuse huvides ehitame Linuxi käsurealt, mitte ehitustööriista, näiteks Maven.





Järgnev kompileerib lähtefailid sihtkataloogi klassifailideks.

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

Koguge klassifailid täitmiseks JAR -faili.

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

Samuti kogume liidese failid, mis on vajalikud kliendi kogumiseks JAR -i.

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

Kliendi rakendamine

Vaatame nüüd serveriobjektimeetodite käivitamiseks kasutatud kliendi rakendamist.

  • Nagu ka serveri puhul, hankige viide registrile, määrates hostinime, kus register töötab, ja pordi numbri. | _+_ |
  • Seejärel otsige teenust registrist. The Vaata üles() meetod tagastab tühiku, mida saab kasutada teenuste käivitamiseks. | _+_ |
  • Ja kutsuge nõutud argumentide edastamise meetod välja. Siin saame tervituse nime edastades ja välja printides. | _+_ |

Täielik kliendikood:

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

RMI register

Käivitame nüüd serveriprogrammi, et see saaks hakata päringuid esitama.

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

Mis on see erand ? Ühendusest keelduti .

Selle erandi saamise põhjus on järgmine: märkige serverikoodist, et see üritab ühenduse luua kohaliku registriga pordis 1099. Kui see ei õnnestu, saate selle erandi.

Lahenduseks on RMI registri käivitamine. RMI register on Java virtuaalmasinaga kaasas olev programm, mille nimi on rmiregistry . See peaks asuma olen Java virtuaalmasina installimise kataloog. Selle käivitamine on nii lihtne kui:

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

Vaikimisi kuulab register porti 1099. Kui soovite seda kuulata mõnes teises pordis, määrake pordi number järgmiselt.

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

Kontrollige, kas määratud pordis on tõepoolest kuulaja käsk netstat :

kui vana on minu macbook air
Greeting greeting = (Greeting) registry.lookup(name);

Serveri käivitamine

Proovime nüüd serverit uuesti käivitada.

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

Jälle erand! Mis on seekord?

Server ei saa liideseklassi laadida server. Tervitused . See juhtub seetõttu, et RMI register ei saa vajalikku klassi laadida. Seega peate määrama nõutavate klasside asukoha. Üks võimalus seda teha on määrata keskkonnamuutuja 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));
}
}

Kui proovite serverit uuesti käivitada, saate järgmist:

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

Nüüd töötab server.

Kliendi käitamine

Pärast kõigi osade kokkupanekut ja käivitamist on kliendi käitamine lihtne. Selle täitmiseks on vaja sobivaid JAR -e. Nende hulka kuulub klass, mis sisaldab peamine () meetod ja liideseklass. See aktsepteerib argumente, mis näitavad, kus RMI register töötab, ja tervituse nime.

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

Kokkuvõte

Java RMI pakub API -d ja tööriistu koodi kaugkäivituse hõlbustamiseks. Saate rakendada serveri, mis registreerib teenuseobjekti Java RMI registris. Kliendid saavad teenindusmeetodite käivitamiseks teha registrist päringu ja hankida teenuseobjekti tüve. Nagu see näide illustreerib, on kõik üsna lihtne.

Kas kasutate oma projektis Java RMI -d? Milline on olnud teie kogemus? Kas on mingeid alternatiive, mida olete uurinud? Palun andke meile sellest allpool kommentaarides teada.

Jaga Jaga Piiksuma E -post Algaja juhend kõne animeerimiseks

Kõne animeerimine võib olla väljakutse. Kui olete valmis oma projektile dialoogi lisama, jagame teie jaoks protsessi.

Loe edasi
Seotud teemad
  • Programmeerimine
  • Java
Autori kohta Jay Sridhar(17 artiklit avaldatud) Veel Jay Sridharilt

Telli meie uudiskiri

Liituge meie uudiskirjaga, et saada tehnilisi näpunäiteid, ülevaateid, tasuta e -raamatuid ja eksklusiivseid pakkumisi!

Tellimiseks klõpsake siin