Minden a Java RMI rendszerleíró adatbázisáról és használatáról

Minden a Java RMI rendszerleíró adatbázisáról és használatáról

RMI áll távoli módszerrel történő hívás és ahogy a neve is jelzi, egy Java program protokollja egy másik számítógépen futó objektum metódusának meghívására. Egy API -t (Application Programming Interface) biztosít az objektumok egyik programból (az úgynevezett szerver) történő exportálásához, és az objektum módszereinek meghívásához egy másik programból (az úgynevezett kliensből), esetleg egy másik számítógépen.





A Java RMI nyilvántartás a Java RMI rendszer kulcsfontosságú eleme, és központosított könyvtárat biztosít a kiszolgálóknak a szolgáltatások regisztrálásához és az ügyfeleknek ezeknek a szolgáltatásoknak a kereséséhez. Ebben a cikkben megtanuljuk, hogyan kell megvalósítani egy szervert egy objektum és egy kliens egy módszer meghívására a szerveren, valamint regisztrálni és megkeresni a szolgáltatást az RMI -nyilvántartásban.





otthoni gomb nem működik iphone 8

A kiszolgálói felület deklarálása

A Java RMI rendszer működésének bonyolultságának megismeréséhez hajtsunk végre egy egyszerű szerverobjektumot, amely módszert kínál a név elfogadására és az üdvözlés visszaadására. Íme az objektum interfész definíciója:





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

Az interfész nevét hívják Üdvözlet . Egyetlen módszert biztosít, az ún üdvözöl() amely elfogad egy nevet és visszaküldi a megfelelő üdvözletet.

Ahhoz, hogy ezt az interfészt exportálhatónak jelölje meg, ki kell terjesztenie a java.rmi.Távoli felület. A módszernek ki kell jelentenie a dob záradék felsorolása java.rmi.RemoteException minden alkalmazásspecifikus kivétel mellett. Ez azt jelenti, hogy az ügyfélkód képes kezelni (vagy továbbítani) a távoli metódusok meghívási hibáit, mint pl host-not-found , kapcsolat-hiba stb.



A kiszolgálóobjektum megvalósítása

Az interfész deklarálása után (amelyet az ügyfelek használnak) megvalósítjuk a szerver oldali objektumot, és megadjuk a üdvözöl() módszer az ábrán látható módon. Egy egyszerű formátumú karakterláncot használ az üdvözlés formázásához.

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

A szerver fő módszere

Most gyűjtsük össze ezeket a darabokat együtt és hajtsuk végre a fő() a szerver módszere. Nézzük végig az összes lényeges lépést.





  • Az első lépés a szerverobjektum -megvalósítás létrehozása. | _+_ |
  • Ezután egy csonkot kapunk a kiszolgálóobjektumhoz az RMI futásidejéből. A csonk ugyanazt a felületet valósítja meg, mint a szerverobjektum. A módszer azonban megvalósítja a szükséges kommunikációt a távoli szerver objektummal. Ezt a csonkot használja az ügyfél, hogy átláthatóan meghívja a módszert a kiszolgálóobjektumon. | _+_ |
  • A csonk beszerzése után átadjuk ezt a csonkot az RMI -nyilvántartásnak, hogy egy meghatározott nevű szolgáltatáshoz kötődjön. Amikor az ügyfél a szolgáltatás megvalósítását kéri, megkapja a csonkot, amely tudja, hogyan kell kommunikálni a szerverobjektummal. A következőkben a statikus módszer LocateRegistry.getRegistry () a helyi nyilvántartási hivatkozás beszerzésére szolgál. Az rebind () metódust használjuk a név kötéséhez. | _+_ |

A teljes fő módszer.

Greeting greeting = new GreetingObject();

A szerver építése

Most nézzük meg a szerver felépítését. Az egyszerűség kedvéért Linuxon a parancssor használatával építünk, nem pedig egy olyan építési eszközzel, mint a Maven.





Az alábbiakban a forrásfájlokat osztályfájlokba állítjuk össze egy célkönyvtárban.

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

Gyűjtse össze az osztályfájlokat egy JAR fájlba végrehajtás céljából.

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

Ezenkívül összegyűjtjük a kliens JAR könyvtárba fordításához szükséges felületfájlokat.

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

Az Ügyfél megvalósítása

Most nézzük meg a kiszolgálóobjektum -metódusok meghívásához használt kliens megvalósítását.

  • A szerverhez hasonlóan szerezzen be egy hivatkozást a rendszerleíró adatbázisra, megadva azt a gazdagépnevet, ahol a rendszerleíró adatbázis fut, és a port számát. | _+_ |
  • Ezután keresse meg a szolgáltatást a rendszerleíró adatbázisban. Az Nézz fel() metódus visszaad egy csonkot, amely használható a szolgáltatások meghívására. | _+_ |
  • És hívja meg a metódust a szükséges érvek továbbításával. Itt a név átadásával és kinyomtatásával kapjuk az üdvözletet. | _+_ |

A teljes ügyfélkód:

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

Az RMI nyilvántartása

Futtassuk most a szerverprogramot, hogy az elkezdhesse a kérések kiszolgálását.

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

Mi a ezt a kivételt ? kapcsolódás elutasítva .

Ennek a kivételnek az oka az, hogy: a szerverkódból jegyezze meg, hogy megpróbál csatlakozni az 1099 -es porton található helyi rendszerleíró adatbázishoz. Ha ez nem sikerül, akkor ezzel a kivétellel végződik.

A megoldás az RMI Registry futtatása. Az RMI Registry egy Java virtuális géppel együtt szállított program, melynek ún rmiregistry . Meg kell helyezni a am a Java virtuális gép telepítésének könyvtárában. Futtatása olyan egyszerű, mint:

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

Alapértelmezés szerint a rendszerleíró adatbázis hallgatja az 1099 -es portot. Ha másik porton szeretné hallgatni, adja meg a port számát az alábbiak szerint:

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

Ellenőrizze, hogy valóban van -e hallgató a megadott porton a netstat parancsot :

miért nem működik a laptop egér?
Greeting greeting = (Greeting) registry.lookup(name);

A szerver futtatása

Próbáljuk meg újra futtatni a szervert.

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

Ismét kivétel! Mi ezúttal?

A szerver nem tudja betölteni az interfészosztályt szerver. Üdvözlet . Ez azért történik, mert az RMI -nyilvántartás nem tudja betölteni a szükséges osztályt. Tehát meg kell adnia a szükséges osztályok helyét. Ennek egyik módja a CLASSPATH környezeti változó megadása:

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

A szerver újbóli futtatása a következőket eredményezi:

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

Most a szerver fut.

Az ügyfél futtatása

Az összes alkatrész összeszerelése és végrehajtása után az ügyfél futtatása egyszerű. A végrehajtáshoz megfelelő JAR -ok szükségesek. Ide tartozik az osztály, amely a fő() módszer és az interfész osztály. Elfogadja azokat az érveket, amelyek jelzik, hol fut az RMI -nyilvántartás, és az üdvözlés nevét.

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

Összefoglaló

A Java RMI API -t és eszközöket biztosít a kód távoli végrehajtásának megkönnyítésére. Olyan kiszolgálót valósíthat meg, amely regisztrál egy szolgáltatási objektumot a Java RMI nyilvántartásban. Az ügyfelek lekérdezhetik a rendszerleíró adatbázist, és beszerezhetik a szolgáltatásobjektum -csonkot a szolgáltatási módszerek meghívásához. Amint ez a példa szemlélteti, minden nagyon egyszerű.

Java RMI -t használ a projektben? Mi volt a tapasztalata? Vannak alternatívák, amelyeket megvizsgált? Kérjük, tudassa velünk az alábbi megjegyzésekben.

Részvény Részvény Csipog Email Kezdő útmutató a beszéd animálásához

A beszéd animálása kihívást jelenthet. Ha készen áll arra, hogy párbeszédet adjon hozzá a projekthez, lebontjuk a folyamatot.

Olvassa tovább
Kapcsolódó témák
  • Programozás
  • Jáva
A szerzőről Jay Sridhar(17 cikk megjelent) Bővebben: Jay Sridhar

Iratkozzon fel hírlevelünkre

Csatlakozz hírlevelünkhöz, ahol technikai tippeket, véleményeket, ingyenes e -könyveket és exkluzív ajánlatokat találsz!

Feliratkozáshoz kattintson ide