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

Allt om Java RMI-registret och hur man använder det / Programmering

RMI står för fjärråtkomst av metod och, som namnet antyder, ä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. Det tillhandahåller ett API Vad är API och hur är öppna API-filer som ändrar Internet Vad är API-filer, och hur är öppna API-filer som ändrar Internet Har du någonsin undrat hur program på din dator och de webbplatser du besöker "pratar" med varandra? Läs mer (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örning på en annan dator.

Java RMI-registret är en nyckelkomponent i Java RMI-systemet och tillhandahåller en central katalog för servrar att registrera tjänster och för kunder att leta upp dessa tjänster. I den här artikeln lär vi oss hur du implementerar en server för att avslöja ett objekt och en klient för att åberopa en metod på servern, samt att registrera och titta upp tjänsten i RMI-registret.

Deklarera servergränssnittet

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

importera java.rmi.Remote; importera java.rmi.RemoteException; offentligt gränssnitt Hälsokort sträcker fjärrkontroll public String greet (String name) kasta RemoteException;  

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

För att markera detta gränssnitt som exportbart måste det förlängas java.rmi.Remote gränssnitt. Även metoden behöver förklara en kastar klausulnotering java.rmi.RemoteException förutom några programspecifika undantag Java undantag: hanterar du dem rätt? Java Undantag: Hanterar du dem rätt? En undantag i programmering innebär ett exceptionellt tillstånd i programkörningen. Den används när villkoret kan hanteras bättre någon annanstans. Tänk på följande exempel på hantering av Java-undantag. Läs mer . Det här är så att klientkoden kan hantera (eller propagera) fjärråtkomstfel som t.ex. värd ej funnen, Anslutningsfel, etc.

Implementera Serverobjektet

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

public class GreetingObject implementerar hälsning private String fmtString = "Hej,% s"; public String greet (String namn) return String.format (this.fmtString, namn);  

Serverens huvudmetod

Låt oss nu samla alla dessa bitar tillsammans och genomföra main () metod av servern. Låt oss gå igenom alla relevanta steg.

  • Det första steget är att skapa serverns objektimplementering.
    Hälsningshälsning = nytt GreetingObject (); 
  • Därefter får vi en stub för servernobjektet från RMI runtime. Stubben implementerar samma gränssnitt som servernsobjektet. Metoden implementerar emellertid den nödvändiga kommunikationen med fjärrserverobjektet. Denna stub används av klienten för att på ett transparent sätt anropa metoden på servernsobjektet.
    Greeting Stub = (Greeting) UnicastRemoteObject.exportObject (hälsning, 0); 
  • När stubben erhållits överför vi denna stub till RMI-registret för att binda till en angiven namngiven tjänst. När klienten begär en implementering av denna tjänst tar den emot stubben som vet hur man kommunicerar med serverns objekt. I det följande används den statiska metoden LocateRegistry.getRegistry () används för att få den lokala registreringsreferensen. De binda om() Metoden används sedan för att binda namnet till stubben.
    String name = "Greeting"; Registry registry = LocateRegistry.getRegistry (port); registry.rebind (namn, stub); 

Den fullständiga huvudmetoden.

importera java.rmi.registry.LocateRegistry; importera java.rmi.registry.Registry; importera java.rmi.server.UnicastRemoteObject; offentlig klass Main static public void main (String [] args) slår Undantag om (args.length == 0) System.err.println ("användning: Java Main Port #"); System.exit (1);  int index = 0; int port = Integer.parseInt (args [index ++]); String name = "Greeting"; Hälsningshälsning = nytt GreetingObject (); Greeting Stub = (Greeting) UnicastRemoteObject.exportObject (hälsning, 0); Registry registry = LocateRegistry.getRegistry (port); registry.rebind (namn, stub); System.out.println ("Hälsa bunden till \" "+ namn +" \ "");  

Bygga servern

Låt oss nu titta på att bygga servern. För att hålla sakerna 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.

rm -rf mål mkdir mål javac -d mål src / server / *. java 

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

jar cvf target / rmi-server.jar -C mål server 

Vi samlar också in de gränssnittsfiler som krävs för att kompilera klienten i ett bibliotek JAR.

jar cvf mål / rmi-lib.jar-C-server / Greeting.class 

Genomförande av kunden

Låt oss nu titta på att implementera klienten som används för att åberopa serverns objektmetoder.

  • Som med servern, få en hänvisning till registret, specificera värdnamnet där registret körs och portnummer.
    Registry registry = LocateRegistry.getRegistry (värd, port); 
  • Titta sedan på tjänsten i registret. De slå upp() Metoden returnerar en stub som kan användas för att åberopa tjänster.
    Hälsning hälsning = (hälsning) registry.lookup (namn); 
  • Och åberopa metoden som passerar de nödvändiga argumenten. Här får vi hälsningen genom att skicka namnet och skriva ut det.
    System.out.println (namn + "reported:" + greeting.greet (myName)); 

Den fullständiga klientkoden:

paketklient; importera java.rmi.registry.LocateRegistry; importera java.rmi.registry.Registry; import server.Greeting; offentlig klass Client static public void main (String [] args) slår Undantag om (args.length! = 3) System.err.println ("användning: java Client host port myName"); System.exit (1);  int index = 0; Stringsvärd = args [index ++]; int port = Integer.parseInt (args [index ++]); String myName = args [index ++]; String name = "Greeting"; Registry registry = LocateRegistry.getRegistry (värd, port); Hälsning hälsning = (hälsning) registry.lookup (namn); System.out.println (namn + "reported:" + greeting.greet (myName));  

RMI-registret

Låt oss nu köra serverns program så att det kan börja betjäna förfrågningar.

java -cp target / rmi-server.jar server. Huvud 1099 # slår Undantag i tråd "main" java.rmi.ConnectException: Anslutning vägrade att vara värd: xxx; Nested undantag är: java.net.ConnectException: Connection nekades 

Vad är detta undantag Hur man hanterar Java-undantag på rätt sätt Hur man hanterar Java-undantag på rätt sätt I den här artikeln lär du dig vilka Java-undantag är, varför de är viktiga, hur man använder dem och vanliga misstag att undvika. Läs mer ? Anslutning vägrade.

Anledningen till att du får detta undantag är att: anteckna från serverns kod som den försöker ansluta till det lokala registret på port 1099. Om det misslyckas slutar du med detta undantag.

Lösningen är att köra RMI-registret. RMI-registret är ett program som skickas med Java Virtual Machine och heter rmiregistry. Det borde vara beläget i bin katalog över Java Virtual Machine-installationen. Att köra det är så enkelt som:

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

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

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

Kontrollera att det verkligen finns en lyssnare i den angivna porten med kommandot netstat 8 CMD-kommandon för att hantera (trådlösa) nätverk i Windows 8 CMD-kommandon för att hantera (trådlösa) nätverk i Windows Om du vill ha fullständig och absolut kontroll över ditt nätverk, måste börja använda Command Prompt. Här är de mest användbara kommandon för hantering och felsökning av ditt hemnätverk. Läs mer :

netstat -an -t tcp -p | grep Lyssna ... tcp6 0 0 ::: 1100 ::: * LISTEN 23450 / rmiregistry 

Kör servern

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

java -cp target / rmi-server.jar server. Huvud 1100 # kastar java.rmi.UnmarshalException: error unmarshalling arguments ... Orsakas av: java.lang.ClassNotFoundException: server.Greeting ... 

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

Servern kan inte ladda gränssnittsklassen server.Greeting. Detta händer eftersom RMI-registret inte kan ladda den obligatoriska klassen. Så du måste ange platsen för de obligatoriska klasserna. Ett sätt att göra det är att ange CLASSPATH-miljövariabeln:

CLASSPATH = ... / ... /junk/target/rmi-lib.jar /usr/lib/jvm/jdk1.8.0_71/bin/rmiregistry 1100 

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

java -cp target / rmi-server.jar server.Main 1100 # utskrifter Hälsa bunden till "Greeting" 

Servern kör nu.

Köra kunden

När alla delar är monterade och utförda är det enkelt att köra klienten. Den behöver lämpliga JAR för utförande. 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.

java -cp target / rmi-client.jar: target / rmi-lib.jar client.Client localhost 1100 Peter # utskrifter Hälsning rapporterad: Hej, Peter 

Sammanfattning

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

Använder du Java RMI i ditt projekt? Vad har du haft erfarenhet av? Finns det några alternativ du har undersökt? Vänligen meddela oss i kommentarerna nedan.

Utforska mer om: Java.