Kaikki Java RMI -rekisteristä ja sen käytöstä

Kaikki Java RMI -rekisteristä ja sen käytöstä

RMI tarkoittaa etämenetelmän kutsuminen ja kuten nimi osoittaa, se on protokolla Java -ohjelmalle kutsuakseen toisessa tietokoneessa käynnissä olevan objektin menetelmän. Se tarjoaa sovellusliittymän (Application Programming Interface), jolla voidaan viedä objekti yhdestä ohjelmasta (nimeltään palvelin) ja kutsua kyseisen objektin menetelmät toisesta ohjelmasta (jota kutsutaan asiakkaaksi), mahdollisesti toisessa tietokoneessa.





Java RMI -rekisteri on keskeinen osa Java RMI -järjestelmää ja tarjoaa keskitetyn hakemiston palvelimille palvelujen rekisteröimiseksi ja asiakkaiden etsimiseksi näistä palveluista. Tässä artikkelissa opimme käyttämään palvelinta, joka paljastaa objektin ja asiakkaan kutsumaan menetelmän palvelimelle, sekä rekisteröimään ja etsimään palvelua RMI -rekisteristä.





aseta gifit taustakuvaksi Windows 10

Palvelinliittymän ilmoittaminen

Jos haluat oppia Java RMI -järjestelmän toimivuuden, otamme käyttöön yksinkertaisen palvelinobjektin, joka tarjoaa menetelmän nimen hyväksymiseksi ja tervehdyksen palauttamiseksi. Tässä on objektirajapinnan määritelmä:





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

Käyttöliittymän nimeä kutsutaan Tervehdys . Se tarjoaa yhden menetelmän nimeltä tervehtiä() joka hyväksyy nimen ja palauttaa sopivan tervehdyksen.

Jotta tämä käyttöliittymä voidaan merkitä vientiin, sen on laajennettava java.rmi.kaukosäädin käyttöliittymä. Menetelmän on myös ilmoitettava a heittää lausekkeen listaus java.rmi.RemoteException mahdollisten sovelluskohtaisten poikkeusten lisäksi. Näin asiakaskoodi voi käsitellä (tai levittää) etämenetelmän kutsumisvirheitä, kuten isäntä-ei löydy , yhteys-vika , jne.



Palvelinobjektin toteuttaminen

Kun olemme ilmoittaneet käyttöliittymän (jota asiakkaat käyttävät), toteutamme palvelinpuolen objektin ja annamme tervehtiä() menetelmä kuvan mukaisesti. Se käyttää tervehdyksen muotoilussa yksinkertaista muotoilumerkkijonoa.

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

Palvelimen päämenetelmä

Keräämme nyt kaikki nämä osat yhteen ja toteutamme pää () palvelimen menetelmä. Käydään läpi kaikki asiaankuuluvat vaiheet.





  • Ensimmäinen askel on luoda palvelinobjektin toteutus. | _+_ |
  • Seuraavaksi hankimme tynkän palvelinobjektille RMI -ajon ajalta. Tynkä toteuttaa saman käyttöliittymän kuin palvelinobjekti. Menetelmä toteuttaa kuitenkin vaaditun tiedonsiirron etäpalvelinobjektin kanssa. Asiakas käyttää tätä tynkää käyttämään menetelmää läpinäkyvästi palvelinobjektissa. | _+_ |
  • Kun tynkä on saatu, luovutamme tämän tynkän RMI -rekisterille sitoaksesi määritettyyn nimettyyn palveluun. Kun asiakas pyytää tämän palvelun käyttöönottoa, se vastaanottaa tynkän, joka osaa kommunikoida palvelinobjektin kanssa. Seuraavassa staattinen menetelmä LocateRegistry.getRegistry () käytetään paikallisen rekisteriviittauksen hankkimiseen. The sitoa () menetelmää käytetään sitten nimen sitomiseen tynkään. | _+_ |

Täydellinen päämenetelmä.

Greeting greeting = new GreetingObject();

Palvelimen rakentaminen

Katsotaanpa nyt palvelimen rakentamista. Jotta asiat pysyisivät yksinkertaisina, rakennamme käyttämällä komentoriviä Linuxissa Mavenin kaltaisen rakennustyökalun sijaan.





Seuraava kokoaa lähdetiedostot kohdetiedoston luokkatiedostoiksi.

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

Kerää luokkatiedostot JAR -tiedostoon suoritettavaksi.

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

Keräämme myös rajapintatiedostot, joita tarvitaan asiakkaan kääntämiseen kirjastoon 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 + ''');
}
}

Asiakkaan toteuttaminen

Tarkastellaan nyt palvelinobjektimenetelmien kutsumiseen käytetyn asiakkaan käyttöönottoa.

  • Kuten palvelimessa, hanki viittaus rekisteriin, määrittämällä isäntänimi, jossa rekisteri on käynnissä, ja portin numero. | _+_ |
  • Etsi seuraavaksi palvelu rekisteristä. The Katso ylös() menetelmä palauttaa tynkän, jota voidaan käyttää palveluiden kutsumiseen. | _+_ |
  • Käytä menetelmää vaadittujen argumenttien välittämiseksi. Täällä saamme tervehdyksen välittämällä nimen ja tulostamalla sen. | _+_ |

Täydellinen asiakaskoodi:

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

RMI -rekisteri

Suorita nyt palvelinohjelma, jotta se voi alkaa lähettää pyyntöjä.

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

Mikä on tämä poikkeus ? yhteys evätty .

Syy tähän poikkeukseen on seuraava: huomaa palvelinkoodista, että se yrittää muodostaa yhteyden paikalliseen rekisteriin portissa 1099. Jos tämä epäonnistuu, päädyt tähän poikkeukseen.

Ratkaisu on ajaa RMI -rekisteri. RMI -rekisteri on Java -virtuaalikoneen mukana toimitettu ohjelma, jonka nimi on rmiregistry . Sen pitäisi sijaita olen Java Virtual Machine -asennuksen hakemistoon. Sen suorittaminen on yksinkertaista:

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

Oletuksena rekisteri kuuntelee porttia 1099. Jos haluat saada sen kuuntelemaan toisessa portissa, määritä portin numero seuraavasti:

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

Tarkista, että määritetyssä portissa on todellakin kuuntelija komento netstat :

kuinka asettaa oletustili Googlessa
Greeting greeting = (Greeting) registry.lookup(name);

Palvelin käynnissä

Yritetään nyt käynnistää palvelin uudelleen.

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

Jälleen poikkeus! Mitä on tällä kertaa?

Palvelin ei voi ladata käyttöliittymäluokkaa palvelimelle . Tämä johtuu siitä, että RMI -rekisteri ei voi ladata vaadittua luokkaa. Joten sinun on määritettävä vaadittujen luokkien sijainti. Yksi tapa tehdä se on määrittää CLASSPATH -ympäristömuuttuja:

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

Kun yrität käyttää palvelinta uudelleen, saat:

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

Nyt palvelin on käynnissä.

Asiakkaan suorittaminen

Kun kaikki osat on koottu ja suoritettu, asiakkaan suorittaminen on yksinkertaista. Se tarvitsee asianmukaiset JAR: t suoritettavaksi. Näitä ovat luokka, joka sisältää pää () menetelmä ja käyttöliittymäluokka. Se hyväksyy argumentit, jotka osoittavat, missä RMI -rekisteri on käynnissä, ja tervehdyksen nimen.

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

Yhteenveto

Java RMI tarjoaa sovellusliittymän ja työkaluja koodin suorittamisen helpottamiseksi. Voit ottaa käyttöön palvelimen, joka rekisteröi palveluobjektin Java RMI -rekisteriin. Asiakkaat voivat hakea rekisteristä ja hankkia palveluobjektin tynkän palvelumenetelmiä varten. Kuten tämä esimerkki havainnollistaa, kaikki on melko yksinkertaista.

Käytätkö Java RMI: tä projektissasi? Mikä on ollut kokemuksesi? Onko sinulla vaihtoehtoja, joita olet tutkinut? Kerro meille alla olevissa kommenteissa.

Jaa Jaa Tweet Sähköposti Aloittelijan opas puheen animointiin

Puheen animointi voi olla haaste. Jos olet valmis aloittamaan vuoropuhelun lisäämisen projektiin, jaamme prosessin puolestasi.

Lue seuraava
Liittyvät aiheet
  • Ohjelmointi
  • Java
Kirjailijasta Jay Sridhar(17 artikkelia julkaistu) Lisää Jay Sridharilta

tilaa uutiskirjeemme

Liity uutiskirjeeseemme saadaksesi teknisiä vinkkejä, arvosteluja, ilmaisia ​​e -kirjoja ja ainutlaatuisia tarjouksia!

Klikkaa tästä tilataksesi