Viss par Java RMI reģistru un tā izmantošanu

Viss par Java RMI reģistru un tā izmantošanu

RMI apzīmē attālās metodes izsaukšana un, kā norāda nosaukums, ir Java programmas protokols, lai izsauktu objekta metodi, kas darbojas citā datorā. Tas nodrošina API (lietojumprogrammu programmēšanas saskarni) objekta eksportēšanai no vienas programmas (saukts par serveri) un šī objekta metožu izsaukšanai no citas programmas (sauktas par klientu), iespējams, darbojas citā datorā.





Java RMI reģistrs ir Java RMI sistēmas galvenā sastāvdaļa un nodrošina centralizētu direktoriju serveriem pakalpojumu reģistrēšanai un klientiem šo pakalpojumu meklēšanai. Šajā rakstā mēs uzzinām, kā ieviest serveri, lai pakļautu objektu, un klients varētu izsaukt metodi serverī, kā arī reģistrēt un meklēt pakalpojumu RMI reģistrā.





Vai jūs varat spēlēt ps3 spēles uz ps4 konsoles?

Servera saskarnes deklarēšana

Lai uzzinātu Java RMI sistēmas darbības sarežģītību, ļaujiet mums ieviest vienkāršu servera objektu, kas nodrošina metodi vārda pieņemšanai un sveiciena atdošanai. Šeit ir objekta saskarnes definīcija:





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

Tiek saukts interfeisa nosaukums Sveiciens . Tas nodrošina vienu metodi, ko sauc sveikt() kas pieņem vārdu un atgriež piemērotu sveicienu.

Lai atzīmētu šo saskarni kā eksportējamu, tai ir jāpagarina java.rmi. Tālvadība interfeisu. Arī metodei jādeklarē a met klauzulu uzskaitījums java.rmi.RemoteException papildus visiem lietojumprogrammu izņēmumiem. Tas ir tāpēc, lai klienta kods varētu apstrādāt (vai izplatīt) attālās metodes izsaukšanas kļūdas, piemēram, saimnieks nav atrasts , savienojums-kļūme utt.



Servera objekta ieviešana

Pēc interfeisa (ko izmanto klienti) deklarēšanas mēs ieviešam servera puses objektu un nodrošinām sveikt() metode, kā parādīts attēlā. Apsveikuma formatēšanai tiek izmantota vienkārša formāta virkne.

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

Servera galvenā metode

Tagad apkoposim visus šos gabalus kopā un ieviesīsim galvenais () servera metode. Ļaujiet mums iziet visus attiecīgos soļus.





  • Pirmais solis ir izveidot servera objekta ieviešanu. | _+_ |
  • Tālāk mēs iegūstam nepilnību servera objektam no RMI izpildlaika. Stubs īsteno to pašu saskarni kā servera objekts. Tomēr šī metode nodrošina nepieciešamo saziņu ar attālā servera objektu. Šo nepilnību klients izmanto, lai pārredzami izsauktu metodi servera objektā. | _+_ |
  • Kad nepilnības ir iegūtas, mēs to nododam RMI reģistram, lai saistītos ar norādīto pakalpojumu. Kad klients pieprasa šī pakalpojuma ieviešanu, tas saņem nepilnību, kas zina, kā sazināties ar servera objektu. Tālāk statiskā metode LocateRegistry.getRegistry () tiek izmantots, lai iegūtu vietējā reģistra atsauci. The saitēt () metode tiek izmantota, lai saistītu nosaukumu ar nepilnību. | _+_ |

Pilnīga galvenā metode.

Greeting greeting = new GreetingObject();

Servera izveide

Tagad apskatīsim servera izveidi. Lai viss būtu vienkāršs, mēs veidojam, izmantojot Linux komandrindu, nevis tādu veidošanas rīku kā Maven.





Tālāk ir apkopoti avota faili klases failos mērķa direktorijā.

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

Apkopojiet klases failus izpildei JAR failā.

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

Mēs arī apkopojam saskarnes failus, kas nepieciešami klienta apkopošanai bibliotēkā 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 + ''');
}
}

Klienta ieviešana

Tagad apskatīsim klienta ieviešanu, ko izmantoja servera objektu metožu izsaukšanai.

  • Tāpat kā ar serveri, iegūstiet atsauci uz reģistru, norādot resursdatora nosaukumu, kurā darbojas reģistrs, un porta numuru. | _+_ |
  • Pēc tam meklējiet pakalpojumu reģistrā. The uzmeklēt () metode atgriež nepilnību, ko var izmantot pakalpojumu izsaukšanai. | _+_ |
  • Un piesauciet metodi, nododot nepieciešamos argumentus. Šeit mēs saņemam sveicienu, nododot nosaukumu un izdrukājot to. | _+_ |

Pilns klienta kods:

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

RMI reģistrs

Tagad palaidīsim servera programmu, lai tā varētu sākt apkalpot pieprasījumus.

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

Kas ir šis izņēmums ? savienojums atteikts .

Šī izņēmuma iemesls ir šāds: no servera koda atzīmējiet, ka tas mēģina izveidot savienojumu ar vietējo reģistru portā 1099. Ja tas neizdodas, jūs galu galā saņemat šo izņēmumu.

Risinājums ir palaist RMI reģistru. RMI reģistrs ir programma, kas tiek piegādāta kopā ar Java virtuālo mašīnu un tiek saukta rmiregistry . Tam jāatrodas esmu Java virtuālās mašīnas instalācijas direktorijā. Tās palaišana ir tik vienkārša kā:

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

Pēc noklusējuma reģistrs klausās portu 1099. Lai to klausītos citā portā, norādiet porta numuru šādi:

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

Pārbaudiet, vai norādītajā ostā patiešām ir klausītājs ar komanda netstat :

kā atbrīvoties no rindu pārtraukumiem vārdā
Greeting greeting = (Greeting) registry.lookup(name);

Palaist serveri

Mēģināsim vēlreiz palaist serveri.

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

Atkal izņēmums! Kas tas ir šoreiz?

Serveris nevar ielādēt saskarnes klasi serveris. Sveiciens . Tas notiek tāpēc, ka RMI reģistrs nevar ielādēt nepieciešamo klasi. Tātad jums ir jānorāda vajadzīgo nodarbību atrašanās vieta. Viens veids, kā to izdarīt, ir norādīt vides mainīgo 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));
}
}

Mēģinot vēlreiz palaist serveri, tiek parādīts:

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

Tagad serveris darbojas.

Klienta vadīšana

Kad visas detaļas ir samontētas un izpildītas, klienta vadīšana ir vienkārša. Izpildei nepieciešami atbilstoši JAR. Tajos ietilpst klase, kas satur galvenais () metode un saskarnes klase. Tā pieņem argumentus, norādot, kur darbojas RMI reģistrs, un sveiciena nosaukumu.

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

Kopsavilkums

Java RMI nodrošina API un rīkus, lai atvieglotu attālinātu koda izpildi. Varat ieviest serveri, kas reģistrē pakalpojuma objektu Java RMI reģistrā. Klienti var veikt vaicājumus reģistrā un iegūt pakalpojuma objekta nepilnības, lai izsauktu pakalpojumu metodes. Kā ilustrē šis piemērs, tas viss ir pavisam vienkārši.

Vai savā projektā izmantojat Java RMI? Kāda ir bijusi jūsu pieredze? Vai ir kādas alternatīvas, kuras esat izpētījis? Lūdzu, informējiet mūs zemāk esošajos komentāros.

Kopīgot Kopīgot Čivināt E -pasts Rokas animācijas rokasgrāmata iesācējiem

Runas animēšana var būt izaicinājums. Ja esat gatavs sākt pievienot dialogu savam projektam, mēs to sadalīsim jūsu vietā.

Lasīt Tālāk
Saistītās tēmas
  • Programmēšana
  • Java
Par autoru Džejs Šridhars(Publicēti 17 raksti) Vairāk no Jay Sridhar

Abonējiet mūsu biļetenu

Pievienojieties mūsu informatīvajam izdevumam, lai iegūtu tehniskus padomus, pārskatus, bezmaksas e -grāmatas un ekskluzīvus piedāvājumus!

Noklikšķiniet šeit, lai abonētu