Alt om Java RMI -registreringsdatabasen og hvordan det bruges

Alt om Java RMI -registreringsdatabasen og hvordan det bruges

RMI står for påkaldelse af fjernmetode og, som navnet angiver, er en protokol for et Java -program til at påberåbe en metode til et objekt, der kører på en anden computer. Det giver en API (Application Programming Interface) til eksport af et objekt fra et program (kaldet serveren) og påberåber metoderne for objektet fra et andet program (kaldet klienten), muligvis kører på en anden computer.





Java'en RMI -registreringsdatabasen er en nøglekomponent i Java RMI -systemet og giver et centraliseret bibliotek, hvor servere kan registrere tjenester og for klienter at slå disse tjenester op. I denne artikel lærer vi, hvordan man implementerer en server til at afsløre et objekt og en klient til at påberåbe sig en metode på serveren samt registrere og slå tjenesten op i RMI -registreringsdatabasen.





hvordan man opretter en gendannelsesdisk til Windows 8.1

Deklaration af servergrænsefladen

For at lære indviklingen i, hvordan Java RMI -systemet fungerer, lad os implementere et simpelt serverobjekt, der giver en metode til at acceptere et navn og returnere en hilsen. Her er definitionen af ​​objektgrænsefladen:





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

Navnet på grænsefladen kaldes Hilsen . Det giver en enkelt metode kaldet hilse() som accepterer et navn og returnerer en passende hilsen.

For at markere denne grænseflade som eksporterbar, skal den forlænge java.rmi.Remote grænseflade. Metoden skal også erklære en kaster klausulfortegnelse java.rmi.RemoteException ud over eventuelle applikationsspecifikke undtagelser. Dette er for at klientkoden kan håndtere (eller udbrede) fjernmetodefejl, f.eks vært-ikke-fundet , forbindelse-fejl , etc.



Implementering af serverobjektet

Efter at have erklæret grænsefladen (som bruges af klienterne) implementerer vi objektivet på serversiden og leverer hilse() metode som vist. Den bruger en simpel formatstreng til at 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

Lad os nu samle alle disse stykker sammen og implementere main () serverens metode. Lad os gå igennem hvert af de relevante trin.





  • Det første trin er at oprette serverobjektimplementeringen. | _+_ |
  • Dernæst får vi en stub til serverobjektet fra RMI -runtime. Stubben implementerer den samme grænseflade som serverobjektet. Metoden implementerer imidlertid den nødvendige kommunikation med fjernserverobjektet. Denne stub bruges af klienten til transparent at påberåbe metoden på serverobjektet. | _+_ |
  • Når stubben er opnået, overleverer vi denne stub til RMI -registreringsdatabasen for at binde til en bestemt navngivet tjeneste. Når klienten anmoder om en implementering af denne service, modtager den den stub, der ved, hvordan man kommunikerer med serverobjektet. I det følgende, den statiske metode LocateRegistry.getRegistry () bruges til at hente den lokale registreringsreference. Det rebind () metode bruges derefter til at binde navnet til stubben. | _+_ |

Den komplette hovedmetode.

Greeting greeting = new GreetingObject();

Opbygning af serveren

Lad os nu se nærmere på at bygge serveren. For at holde tingene enkle bygger vi ved hjælp af kommandolinjen på Linux i stedet for at bruge et byggeværktøj som Maven.





Følgende kompilerer kildefilerne til klassefiler i en målmappe.

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

Saml klassefilerne i en JAR -fil til udførelse.

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

Vi indsamler også de grænsefladefiler, der er nødvendige for at 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 af klienten

Lad os nu se nærmere på implementering af den klient, der bruges til at påberåbe serverobjektmetoderne.

  • Som med serveren skal du hente en reference til registreringsdatabasen med angivelse af værtsnavnet, hvor registreringsdatabasen kører, og portnummeret. | _+_ |
  • Slå derefter op på tjenesten i registreringsdatabasen. Det kig op() metode returnerer en stub, der kan bruges til påkaldelse af tjenester. | _+_ |
  • Og påberåbe metoden, der sender de nødvendige argumenter. Her får vi hilsenen ved at passere navnet og printe det ud. | _+_ |

Den komplette klientkode:

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

RMI -registreringsdatabasen

Lad os nu køre serverprogrammet, så det kan begynde at servere anmodninger.

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

Hvad er denne undtagelse ? Forbindelse nægtet .

Grunden til at du får denne undtagelse er fordi: Bemærk fra serverkoden, at den forsøger at oprette forbindelse til det lokale registreringsdatabase på port 1099. Hvis det mislykkes, ender du med denne undtagelse.

Løsningen er at køre RMI -registreringsdatabasen. RMI -registreringsdatabasen er et program, der leveres med Java Virtual Machine og kaldes rmiregistry . Det skal være placeret i er bibliotek over Java Virtual Machine -installationen. Det er så enkelt at køre det som:

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

Som standard lytter registreringsdatabasen til port 1099. For at få den til at lytte på en anden port, skal du angive portnummeret som følger:

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

Kontroller, at der faktisk er en lytter på den angivne port med kommandoen netstat :

hvordan man tænder for lav strømtilstand på iphone
Greeting greeting = (Greeting) registry.lookup(name);

Kører serveren

Lad os nu prøve at køre serveren igen.

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

En undtagelse igen! Hvad er det denne gang?

Serveren kunne ikke indlæse interfaceklassen server. hilsen . Dette sker, fordi RMI -registreringsdatabasen ikke kan indlæse den nødvendige klasse. Så du skal angive placeringen af ​​de nødvendige klasser. En måde at gøre det på er at angive CLASSPATH -miljøvariablen:

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

At prøve at køre serveren igen giver:

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

Nu kører serveren.

Kører klienten

Efter at alle delene er samlet og udført, er det enkelt at køre klienten. Det har brug for de relevante JAR'er til udførelse. Disse inkluderer klassen, der indeholder main () metode og grænsefladeklassen. Det accepterer argumenter, der angiver, hvor RMI -registreringsdatabasen kører, og et navn til hilsenen.

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

Resumé

Java RMI giver en API og værktøjer til at gøre fjernudførelse af kode lettere. Du kan implementere en server, der registrerer et serviceobjekt med Java RMI Registry. Klienter kan forespørge i registreringsdatabasen og få serviceobjektstub til at påberåbe sig servicemetoderne. Som dette eksempel illustrerer, er det hele ganske enkelt.

Bruger du Java RMI i dit projekt? Hvad har din erfaring været? Er der nogen alternativer, du har undersøgt? Lad os vide det i kommentarerne herunder.

Del Del Tweet E -mail En begyndervejledning til animering af tale

Animering af tale kan være en udfordring. Hvis du er klar til at begynde at tilføje dialog til dit projekt, nedbryder vi processen for dig.

Læs Næste
Relaterede emner
  • Programmering
  • Java
Om forfatteren Jay Sridhar(17 artikler udgivet) Mere fra Jay Sridhar

Abonner på vores nyhedsbrev

Tilmeld dig vores nyhedsbrev for at få tekniske tips, anmeldelser, gratis e -bøger og eksklusive tilbud!

Klik her for at abonnere