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áhozA 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
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