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 talAtt 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
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