Alles over het Java RMI-register en hoe het te gebruiken

Alles over het Java RMI-register en hoe het te gebruiken / Programming

RMI betekent methodeoproep op afstand en, zoals de naam aangeeft, een protocol voor een Java-programma om een ​​methode op te roepen voor een object dat op een andere computer wordt uitgevoerd. Het biedt een API Wat zijn API's en hoe zijn open API's die het internet veranderen Wat zijn API's, en hoe veranderen open API's het internet Heb je je ooit afgevraagd hoe programma's op je computer en de websites die je bezoekt met elkaar "praten"? Read More (Application Programming Interface) voor het exporteren van een object vanuit een programma (de server genoemd) en het aanroepen van de methoden van dat object vanuit een ander programma (de client genoemd), mogelijk op een andere computer.

De Java RMI-register is een belangrijk onderdeel van het Java RMI-systeem en biedt een gecentraliseerde directory voor servers om services te registreren en voor clients om deze services op te zoeken. In dit artikel leren we hoe we een server kunnen implementeren om een ​​object en een client bloot te stellen om een ​​methode op de server aan te roepen, en om de service in het RMI-register te registreren en op te zoeken..

De serverinterface declareren

Om de fijne kneepjes van het Java RMI-systeem te leren, kunnen we een eenvoudig serverobject implementeren dat een methode biedt om een ​​naam te accepteren en een begroeting terug te sturen. Hier is de definitie van de objectinterface:

importeer java.rmi.Remote; importeer java.rmi.RemoteException; public interface Groet breidt Remote uit public String greet (String name) gooit RemoteException;  

De naam van de interface wordt genoemd Groet. Het biedt een enkele methode genaamd begroeten() die een naam accepteert en een passende begroeting retourneert.

Om deze interface als exporteerbaar te markeren, moet deze worden uitgebreid java.rmi.Remote interface. Ook moet de methode a declareren worpen clausule lijst java.rmi.RemoteException in aanvulling op eventuele toepassingsspecifieke uitzonderingen Java-uitzonderingen: behandelt u ze goed? Java-uitzonderingen: behandelt u ze goed? Een uitzondering in programmering betekent een uitzonderlijke voorwaarde bij het uitvoeren van het programma. Het wordt gebruikt wanneer de aandoening elders beter kan worden afgehandeld. Overweeg de volgende voorbeelden van de afhandeling van Java-uitzonderingen. Lees verder . Dit is zo dat de clientcode externe methode-aanroepfouten kan verwerken (of propageren), zoals host niet gevonden, aansluiting-failure, enz.

Het serverobject implementeren

Na het declareren van de interface (die wordt gebruikt door de clients), implementeren we het server-side-object en bieden we het begroeten() methode zoals getoond. Het maakt gebruik van een eenvoudige tekenreeks om de begroeting op te maken.

public class GreetingObject implementeert Greeting private String fmtString = "Hallo,% s"; public String greet (String naam) return String.format (this.fmtString, name);  

De belangrijkste methode van de server

Laten we nu al deze stukjes samenvoegen en het hoofd() methode van de server. Laten we alle relevante stappen doorlopen.

  • De eerste stap is het maken van de implementatie van het serverobject.
    Begroetingsgroet = nieuw GreetingObject (); 
  • Vervolgens verkrijgen we een stomp voor het serverobject van de RMI-runtime. De stub implementeert dezelfde interface als het serverobject. De methode implementeert echter de vereiste communicatie met het externe serverobject. Dit stomp wordt door de client gebruikt om de methode op het serverobject transparant aan te roepen.
    Groetstub = (begroeting) UnicastRemoteObject.exportObject (begroeting, 0); 
  • Nadat het stub is verkregen, geven we deze stub door aan het RMI-register om aan een opgegeven benoemde service te binden. Wanneer de client een implementatie van deze service aanvraagt, ontvangt deze de stub die weet hoe te communiceren met het serverobject. Hierna volgt de statische methode LocateRegistry.getRegistry () wordt gebruikt om de lokale registerreferentie te verkrijgen. De rebind () methode wordt vervolgens gebruikt om de naam aan de stub te binden.
    String naam = "Begroeting"; Registerregister = LocateRegistry.getRegistry (port); registry.rebind (naam, stub); 

De complete hoofdmethode.

import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; importeer java.rmi.server.UnicastRemoteObject; public class Hoofd static public void main (String [] args) gooit Uitzondering if (args.length == 0) System.err.println ("usage: java Main port #"); System.exit (1);  int index = 0; int port = Integer.parseInt (args [index ++]); String naam = "Begroeting"; Begroetingsgroet = nieuw GreetingObject (); Groetstub = (begroeting) UnicastRemoteObject.exportObject (begroeting, 0); Registerregister = LocateRegistry.getRegistry (port); registry.rebind (naam, stub); System.out.println ("Begroeting gebonden aan \" "+ naam +" \ "");  

De server bouwen

Laten we nu kijken naar het bouwen van de server. Om het simpel te houden, bouwen we met behulp van de opdrachtregel op Linux in plaats van een build-tool zoals Maven.

Het volgende compileert de bronbestanden naar klassebestanden in een doelmap.

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

Verzamel de klassebestanden in een JAR-bestand voor uitvoering.

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

We verzamelen ook de interfacebestanden die nodig zijn voor het compileren van de client in een JAR-bibliotheek.

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

De klant implementeren

Laten we nu kijken naar de implementatie van de client die wordt gebruikt voor het oproepen van de serverobjectmethoden.

  • Net als bij de server, verkrijgt u een verwijzing naar het register, geeft u de hostnaam op waar het register wordt uitgevoerd en het poortnummer.
    Registerregister = LocateRegistry.getRegistry (host, poort); 
  • Zoek vervolgens de service op in het register. De opzoeken() methode retourneert een stub die kan worden gebruikt voor het aanroepen van services.
    Groet groet = (groet) registry.lookup (naam); 
  • En roep de methode op die de vereiste argumenten doorgeeft. Hier krijgen we de begroeting door de naam door te geven en af ​​te drukken.
    System.out.println (naam + "gemeld:" + greet.greet (myName)); 

De volledige klantcode:

pakket cliënt; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import server. Begroeting; public class Client static public void main (String [] args) gooit Uitzondering if (args.length! = 3) System.err.println ("gebruik: 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 naam = "Begroeting"; Registerregister = LocateRegistry.getRegistry (host, poort); Groet groet = (groet) registry.lookup (naam); System.out.println (naam + "gemeld:" + greet.greet (myName));  

Het RMI-register

Laten we nu het serverprogramma uitvoeren, zodat het kan beginnen met het serveren van verzoeken.

java -cp doel / rmi-server.jar server. Hoofd 1099 # gooit uitzondering in thread "main" java.rmi.ConnectException: Connection weigerde te hosten: xxx; geneste uitzondering is: java.net.ConnectException: Connection geweigerd 

Wat is deze uitzondering Behandeling van Java-uitzonderingen op de juiste manier Java-uitzonderingen op de juiste manier verwerken In dit artikel leert u wat Java-uitzonderingen zijn, waarom ze belangrijk zijn, hoe u ze kunt gebruiken en wat u vaak moet voorkomen. Lees verder ? Verbinding geweigerd.

De reden dat u deze uitzondering krijgt, is omdat: noteer vanuit de servercode dat deze probeert verbinding te maken met het lokale register op poort 1099. Als dat mislukt, krijgt u deze uitzondering.

De oplossing is om het RMI-register uit te voeren. Het RMI-register is een programma dat wordt geleverd met de Java Virtual Machine en wordt genoemd rmiregistry. Het moet zich in de bak map van de Java Virtual Machine-installatie. Het uitvoeren van het is zo simpel als:

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

Het register luistert standaard op poort 1099. Geef het poortnummer als volgt op om het op een andere poort te laten luisteren:

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

Controleer of er inderdaad een luisteraar is op de opgegeven poort met de opdracht netstat 8 CMD-opdrachten voor het beheren van (draadloze) netwerken in Windows 8 CMD-opdrachten voor het beheren van (draadloze) netwerken in Windows Als u volledige en absolute controle over uw netwerk wilt, dan kunt u zal de opdrachtprompt moeten gebruiken. Dit zijn de handigste opdrachten voor het beheren en oplossen van problemen met uw thuisnetwerk. Lees verder :

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

De server gebruiken

Laten we nu proberen de server opnieuw uit te voeren.

java -cp doel / rmi-server.jar server.Main 1100 # gooit java.rmi.UnmarshalException: error unmarshalling arguments ... Veroorzaakt door: java.lang.ClassNotFoundException: server.Greeting ... 

Een uitzondering opnieuw! Wat is het deze keer?

De server kan de interfaceklasse niet laden server.Greeting. Dit gebeurt omdat het RMI-register de vereiste klasse niet kan laden. U moet dus de locatie van de vereiste klassen opgeven. Een manier om dit te doen is om de omgevingsvariabele CLASSPATH op te geven:

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

Opnieuw proberen om de server uit te voeren, geeft:

java -cp doel / rmi-server.jar server. Belangrijkste 1100 # prints Groet gebonden aan "Begroeting" 

Nu draait de server.

De client uitvoeren

Nadat alle onderdelen zijn geassembleerd en uitgevoerd, is het uitvoeren van de client eenvoudig. Het heeft de juiste JAR's nodig voor uitvoering. Deze omvatten de klasse die de bevat hoofd() methode en de interfaceklasse. Het accepteert argumenten die aangeven waar het RMI-register wordt uitgevoerd en een naam voor de begroeting.

java -cp target / rmi-client.jar: target / rmi-lib.jar client.Client localhost 1100 Peter # prints Groeten gemeld: Hallo, Peter 

Samenvatting

Java RMI biedt een API en hulpmiddelen om het uitvoeren van externe code eenvoudiger te maken. U kunt een server implementeren die een service-object registreert bij de Java RMI Registry. Clients kunnen het register doorzoeken en een service-objectstub verkrijgen om de servicemethoden in te schakelen. Zoals dit voorbeeld illustreert, is het allemaal vrij eenvoudig.

Gebruikt u Java RMI in uw project? Wat was je ervaring? Zijn er alternatieven die u heeft onderzocht? Laat het ons weten in de comments hieronder.

Ontdek meer over: Java.