Alt om Java RMI -registret og hvordan du bruker det

Alt om Java RMI -registret og hvordan du bruker det

RMI står for påkallelse av ekstern metode og, som navnet indikerer, er en protokoll for et Java -program for å påberope en metode for et objekt som kjører på en annen datamaskin. Den gir et API (Application Programming Interface) for å eksportere et objekt fra ett program (kalt serveren) og påberope metodene for objektet fra et annet program (kalt klienten), muligens kjøre på en annen datamaskin.





Java RMI -register er en sentral komponent i Java RMI -systemet og gir en sentralisert katalog for servere for å registrere tjenester og for klienter å slå opp disse tjenestene. I denne artikkelen lærer vi hvordan du implementerer en server for å avsløre et objekt og en klient for å påberope en metode på serveren, samt registrere og slå opp tjenesten i RMI -registret.





hvordan se hvem som blokkerte deg på instagram

Deklarere servergrensesnittet

For å lære detaljene om hvordan Java RMI -systemet fungerer, la oss implementere et enkelt serverobjekt som gir en metode for å godta et navn og returnere en hilsen. Her er definisjonen av objektgrensesnittet:





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

Navnet på grensesnittet kalles Hilsen . Den gir en enkelt metode kalt hilse på() som godtar et navn og returnerer en passende hilsen.

For å merke dette grensesnittet som eksporterbart, må det utvides java.rmi.Remote grensesnitt. Metoden må også erklære a kaster klausuloppføring java.rmi.RemoteException i tillegg til eventuelle applikasjonsspesifikke unntak. Dette er slik at klientkoden kan håndtere (eller spre) fjerntliggende fremgangsmåtefeil, for eksempel vert-ikke-funnet , tilkobling-feil , etc.



Implementering av serverobjektet

Etter å ha erklært grensesnittet (som brukes av klientene), implementerer vi objektivet på serversiden og gir hilse på() metode som vist. Den bruker en enkel formatstreng for å formatere hilsenen.

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

Serverens hovedmetode

La oss nå samle alle disse brikkene sammen og implementere hoved() serverens metode. La oss gå gjennom hvert av de relevante trinnene.





  • Det første trinnet er å lage serverobjektimplementeringen. | _+_ |
  • Deretter får vi en stubbe for serverobjektet fra RMI -kjøretiden. Stubben implementerer det samme grensesnittet som serverobjektet. Imidlertid implementerer metoden den nødvendige kommunikasjonen med det eksterne serverobjektet. Denne stubben brukes av klienten til å åpne metoden på serverobjektet på en transparent måte. | _+_ |
  • Når stubben er oppnådd, overleverer vi denne stubben til RMI -registret for å binde til en spesifisert navngitt tjeneste. Når klienten ber om implementering av denne tjenesten, mottar den stubben som vet hvordan den skal kommunisere med serverobjektet. I det følgende, den statiske metoden LocateRegistry.getRegistry () brukes for å skaffe den lokale registerreferansen. De rebind () metoden brukes deretter til å binde navnet til stubben. | _+_ |

Den komplette hovedmetoden.

Greeting greeting = new GreetingObject();

Å bygge serveren

La oss nå se nærmere på å bygge serveren. For å holde ting enkelt, bygger vi ved hjelp av kommandolinjen på Linux i stedet for å bruke et byggeverktøy som Maven.





Følgende kompilerer kildefilene til klassefiler i en målkatalog.

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

Samle klassefilene til en JAR -fil for utførelse.

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

Vi samler også grensesnittfilene som kreves for å kompilere klienten til et 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 + ''');
}
}

Implementering av klienten

La oss nå undersøke implementeringen av klienten som ble brukt for å påkalle serverobjektmetodene.

  • Som med serveren, skaff en referanse til registret som angir vertsnavnet der registret kjører, og portnummeret. | _+_ |
  • Slå deretter opp tjenesten i registret. De se opp() method returnerer en stubbe som kan brukes til å påkalle tjenester. | _+_ |
  • Og påkall metoden som sender de nødvendige argumentene. Her får vi hilsenen ved å passere navnet og skrive det ut. | _+_ |

Den komplette klientkoden:

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

RMI -registeret

La oss nå kjøre serverprogrammet slik at det kan begynne å vise forespørsler.

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

Hva er dette unntaket ? Tilkobling nektet .

Grunnen til at du får dette unntaket er fordi: merk fra serverkoden at den prøver å koble til det lokale registret på port 1099. Hvis det mislykkes, ender du opp med dette unntaket.

Løsningen er å kjøre RMI -registret. RMI -registret er et program som leveres med Java Virtual Machine og kalles regi . Den skal ligge i er katalogen for Java Virtual Machine -installasjonen. Å kjøre det er så enkelt som:

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

Som standard hører registret på port 1099. For å få det til å lytte på en annen port, spesifiser portnummeret som følger:

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

Kontroller at det faktisk er en lytter på den angitte porten med kommandoen netstat :

kan du spille fortnite uten ps plus
Greeting greeting = (Greeting) registry.lookup(name);

Kjører serveren

La oss nå prøve å kjøre serveren igjen.

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

Et unntak igjen! Hva er det denne gangen?

Serveren kan ikke laste inn grensesnittklassen server. Hilsen . Dette skjer fordi RMI -registret ikke kan laste den nødvendige klassen. Så du må spesifisere plasseringen av de nødvendige klassene. En måte å gjøre det på er å spesifisere CLASSPATH -miljøvariabelen:

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

Å prøve å kjøre serveren igjen gir:

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å kjører serveren.

Kjører klienten

Etter at alle delene er satt sammen og utført, er det enkelt å kjøre klienten. Den trenger de riktige JAR -ene for utførelse. Disse inkluderer klassen som inneholder hoved() metode og grensesnittklassen. Den godtar argumenter som angir hvor RMI -registret kjører, og et navn på hilsenen.

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

Sammendrag

Java RMI tilbyr et API og verktøy for å gjøre ekstern kjøring av kode enklere. Du kan implementere en server som registrerer et serviceobjekt med Java RMI -registret. Klienter kan spørre i registret og skaffe serviceobjektstubbe for å påkalle servicemetodene. Som dette eksemplet illustrerer, er alt ganske enkelt.

Bruker du Java RMI i prosjektet ditt? Hva har du opplevd? Er det noen alternativer du har undersøkt? Gi oss beskjed i kommentarene nedenfor.

Dele Dele kvitring E -post En nybegynnerguide for animering av tale

Å animere tale kan være en utfordring. Hvis du er klar til å begynne å legge til dialog i prosjektet ditt, bryter vi ned prosessen for deg.

Les neste
Relaterte temaer
  • Programmering
  • Java
Om forfatteren Jay Sridhar(17 artikler publisert) Mer fra Jay Sridhar

Abonner på vårt nyhetsbrev

Bli med i vårt nyhetsbrev for tekniske tips, anmeldelser, gratis ebøker og eksklusive tilbud!

Klikk her for å abonnere