Allt om Java RMI -registret och hur du använder det

Allt om Java RMI -registret och hur du använder det

RMI står för fjärranvändning av metod och, som namnet indikerar, är ett protokoll för ett Java -program för att åberopa en metod för ett objekt som körs på en annan dator. Den tillhandahåller ett API (Application Programming Interface) för att exportera ett objekt från ett program (kallat servern) och åberopa metoderna för det objektet från ett annat program (kallat klienten), eventuellt körs på en annan dator.





Java RMI -registret är en nyckelkomponent i Java RMI -systemet och tillhandahåller en centraliserad katalog för servrar för att registrera tjänster och för klienter att leta upp dessa tjänster. I den här artikeln lär vi oss hur man implementerar en server för att exponera ett objekt och en klient för att åberopa en metod på servern, samt att registrera och söka upp tjänsten i RMI -registret.





stoppkod oväntad kärnlägesfälla

Deklarerar servergränssnittet

För att lära oss invecklingarna i hur Java RMI -systemet fungerar, låt oss implementera ett enkelt serverobjekt som ger en metod för att acceptera ett namn och returnera en hälsning. Här är definitionen av objektgränssnittet:





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

Gränssnittets namn kallas Hälsning . Det ger en enda metod som kallas hälsa() som accepterar ett namn och returnerar en lämplig hälsning.

För att markera detta gränssnitt som exporterbart måste det förlänga java.rmi.Remote gränssnitt. Metoden måste också deklarera a kastar klausulförteckning java.rmi.RemoteException förutom alla applikationsspecifika undantag. Detta är så att klientkoden kan hantera (eller sprida) felaktiga metodinropsfel som t.ex. värd ej funnen , Anslutningsfel , etc.



Implementering av serverobjektet

Efter att ha deklarerat gränssnittet (som används av klienterna) implementerar vi objektet på serversidan och tillhandahåller hälsa() metod som visas. Den använder en enkel formatsträng för att formatera hälsningen.

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

Serverns huvudmetod

Låt oss nu samla alla dessa bitar tillsammans och implementera main () serverns metod. Låt oss gå igenom vart och ett av de relevanta stegen.





  • Det första steget är att skapa serverobjektimplementeringen. | _+_ |
  • Därefter får vi en stub för serverobjektet från RMI -körtiden. Stubben implementerar samma gränssnitt som serverobjektet. Metoden implementerar emellertid den nödvändiga kommunikationen med fjärrserverobjektet. Denna stubbe används av klienten för att på ett öppet sätt anropa metoden på serverobjektet. | _+_ |
  • När stubben har erhållits överlämnar vi denna stubbe till RMI -registret för att binda till en angiven namngiven tjänst. När klienten begär en implementering av denna tjänst, mottar den stubben som vet hur man kommunicerar med serverobjektet. I det följande, den statiska metoden LocateRegistry.getRegistry () används för att hämta den lokala registerreferensen. De binda om() metod används sedan för att binda namnet till stubben. | _+_ |

Den fullständiga huvudmetoden.

Greeting greeting = new GreetingObject();

Bygga servern

Låt oss nu undersöka byggandet av servern. För att hålla saker enkla bygger vi med kommandoraden på Linux istället för att använda ett byggverktyg som Maven.





Följande sammanställer källfilerna till klassfiler i en målkatalog.

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

Samla klassfilerna i en JAR -fil för körning.

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

Vi samlar också de gränssnittsfiler som krävs för att kompilera klienten till ett 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

Låt oss nu undersöka implementeringen av klienten som används för att anropa serverobjektmetoderna.

  • Som med servern, skaffa en referens till registret med angivande av värdnamnet där registret körs och portnumret. | _+_ |
  • Sök sedan upp tjänsten i registret. De slå upp() metod returnerar en stubbe som kan användas för att åberopa tjänster. | _+_ |
  • Och åberopa metoden som skickar de nödvändiga argumenten. Här får vi hälsningen genom att skicka namnet och skriva ut det. | _+_ |

Hela kundkoden:

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

RMI -registret

Låt oss nu köra serverprogrammet så att det kan börja servera förfrågningar.

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

Vad är detta undantag ? Anslutning nekades .

Anledningen till att du får detta undantag är att: notera från serverkoden att den försöker ansluta till det lokala registret på port 1099. Om det misslyckas hamnar du med detta undantag.

Lösningen är att köra RMI -registret. RMI -registret är ett program som levereras med Java Virtual Machine och kallas rmiregistry . Den ska ligga i am katalog över Java Virtual Machine -installationen. Att köra det är så enkelt som:

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

Som standard lyssnar registret på port 1099. För att få det att lyssna på en annan port anger du portnumret enligt följande:

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

Kontrollera att det verkligen finns en lyssnare i den angivna porten med kommandot netstat :

ps4 -styrenheten kopplas bort och kommer inte att ansluta igen
Greeting greeting = (Greeting) registry.lookup(name);

Kör servern

Låt oss nu försöka köra servern igen.

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

Ett undantag igen! Vad är det den här gången?

Servern kan inte ladda gränssnittsklassen server.Hälsning . Detta händer eftersom RMI -registret inte kan ladda den nödvändiga klassen. Så du måste ange platsen för de obligatoriska klasserna. Ett sätt att göra det är att ange miljövariabeln 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));
}
}

Att försöka köra servern igen ger:

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ör servern.

Kör klienten

När alla delar är monterade och körs är det enkelt att köra klienten. Den behöver lämpliga JAR för körning. Dessa inkluderar klassen som innehåller main () metod och gränssnittsklassen. Den accepterar argument som anger var RMI -registret körs och ett namn för hälsningen.

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

Sammanfattning

Java RMI tillhandahåller ett API och verktyg för att göra fjärrkörning av kod enklare. Du kan implementera en server som registrerar ett serviceobjekt med Java RMI -registret. Klienter kan fråga i registret och skaffa serviceobjektstub för att använda servicemetoderna. Som det här exemplet illustrerar är allt ganska enkelt.

Använder du Java RMI i ditt projekt? Vad har du haft för erfarenhet? Finns det några alternativ du har undersökt? Meddela oss i kommentarerna nedan.

Dela med sig Dela med sig Tweet E-post En nybörjarguide för att animera tal

Att animera tal kan vara en utmaning. Om du är redo att börja lägga till dialog i ditt projekt bryter vi ner processen åt dig.

Läs Nästa
Relaterade ämnen
  • Programmering
  • Java
Om författaren Jay Sridhar(17 artiklar publicerade) Mer från Jay Sridhar

Prenumerera på vårt nyhetsbrev

Gå med i vårt nyhetsbrev för tekniska tips, recensioner, gratis e -böcker och exklusiva erbjudanden!

Klicka här för att prenumerera