Vše o registru Java RMI a jeho používání

Vše o registru Java RMI a jeho používání

RMI znamená vyvolání vzdálené metody a, jak název napovídá, je protokolem pro program Java pro vyvolání metody objektu spuštěného na jiném počítači. Poskytuje API (Application Programming Interface) pro export objektu z jednoho programu (nazývaného server) a vyvolání metod tohoto objektu z jiného programu (nazývaného klient), případně spuštěného na jiném počítači.





Java RMI registr je klíčovou součástí systému Java RMI a poskytuje centralizovaný adresář pro servery pro registraci služeb a pro klienty pro vyhledávání těchto služeb. V tomto článku se učíme, jak implementovat server pro vystavení objektu a klienta pro vyvolání metody na serveru a také registraci a vyhledání služby v registru RMI.





jakou knihu si mám přečíst příští generátor

Deklarace rozhraní serveru

Abychom se naučili složitosti fungování systému Java RMI, implementujme jednoduchý serverový objekt poskytující metodu pro přijetí jména a vrácení pozdravu. Zde je definice rozhraní objektu:





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

Volá se název rozhraní Pozdrav . Poskytuje jedinou metodu s názvem pozdravit() který přijme jméno a vrátí vhodný pozdrav.

Chcete -li toto rozhraní označit jako exportovatelné, musí rozšířit java.rmi.Vzdálený rozhraní. Také metoda musí deklarovat a hází výpis klauzule java.rmi.RemoteException kromě jakýchkoli výjimek specifických pro aplikaci. Důvodem je, že kód klienta může zpracovávat (nebo šířit) chyby vyvolání vzdálené metody, jako například hostitel nenalezen , selhání připojení , atd.



Implementace objektu serveru

Po deklaraci rozhraní (které používají klienti) implementujeme objekt na straně serveru a poskytneme pozdravit() metoda, jak je ukázáno. K formátování pozdravu používá jednoduchý formátovací řetězec.

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

Hlavní metoda serveru

Pojďme nyní shromáždit všechny tyto kousky dohromady a implementovat hlavní() způsob serveru. Pojďme si projít každý z příslušných kroků.





  • Prvním krokem je vytvoření implementace objektu serveru. | _+_ |
  • Dále získáme stub pro objekt serveru z běhu RMI. Stub implementuje stejné rozhraní jako objekt serveru. Metoda však implementuje požadovanou komunikaci s objektem vzdáleného serveru. Tento stub klient používá k transparentnímu vyvolání metody na objektu serveru. | _+_ |
  • Jakmile je stub získán, předáme tento stub do registru RMI, abychom se svázali se zadanou pojmenovanou službou. Když klient požaduje implementaci této služby, obdrží stub, který ví, jak komunikovat s objektem serveru. V následujícím statická metoda LocateRegistry.getRegistry () slouží k získání odkazu na místní registr. The znovu svázat () metoda se poté použije k navázání názvu na stub. | _+_ |

Kompletní hlavní metoda.

Greeting greeting = new GreetingObject();

Budování serveru

Podívejme se nyní na stavbu serveru. Aby to bylo jednoduché, stavíme pomocí příkazového řádku v Linuxu, a ne pomocí nástroje pro vytváření, jako je Maven.





Následující zkompiluje zdrojové soubory do souborů třídy v cílovém adresáři.

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

Shromážděte soubory třídy do souboru JAR k provedení.

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

Shromažďujeme také soubory rozhraní potřebné pro kompilaci klienta do knihovny 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 + ''');
}
}

Implementace klienta

Podívejme se nyní na implementaci klienta používaného pro vyvolání metod objektu serveru.

  • Stejně jako na serveru získejte odkaz na registr, zadejte název hostitele, kde je registr spuštěn, a číslo portu. | _+_ |
  • Dále vyhledejte službu v registru. The vzhlédnout() metoda vrací stub, který lze použít k vyvolání služeb. | _+_ |
  • A vyvolejte metodu předávající požadované argumenty. Zde získáme pozdrav předáním jména a jeho vytištěním. | _+_ |

Kompletní kód klienta:

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

Registr RMI

Pojďme nyní spustit serverový program, aby mohl začít obsluhovat požadavky.

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

Co je tuto výjimku ? Spojení odmítnuto .

Důvodem, proč dostanete tuto výjimku, je: Poznámka z kódu serveru, že se pokouší připojit k místnímu registru na portu 1099. Pokud se to nezdaří, skončíte s touto výjimkou.

Řešením je spustit registr RMI. Registr RMI je program dodávaný s virtuálním počítačem Java a nazývá se rmiregistry . Měl by být umístěn v dopoledne adresář instalace Java Virtual Machine. Jeho spuštění je tak jednoduché jako:

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

Ve výchozím nastavení registr naslouchá na portu 1099. Chcete -li jej poslouchat na jiném portu, zadejte číslo portu následujícím způsobem:

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

Zkontrolujte, zda je na zadaném portu skutečně posluchač příkaz netstat :

jak opravit hodiny ve Windows 10
Greeting greeting = (Greeting) registry.lookup(name);

Spuštění serveru

Zkusme nyní spustit server znovu.

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

Opět výjimka! Co je to tentokrát?

Server nemůže načíst třídu rozhraní server. pozdrav . K tomu dochází, protože registr RMI nemůže načíst požadovanou třídu. Musíte tedy určit umístění požadovaných tříd. Jedním ze způsobů, jak to udělat, je zadat proměnnou prostředí CLASSPATH:

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

Pokus o opětovné spuštění serveru dává:

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

Nyní server běží.

Spuštění klienta

Po sestavení a spuštění všech částí je spuštění klienta jednoduché. K provedení potřebuje příslušné JAR. Patří sem třída obsahující hlavní() metoda a třída rozhraní. Přijímá argumenty označující, kde je spuštěn registr RMI, a název pozdravu.

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

souhrn

Java RMI poskytuje API a nástroje pro usnadnění vzdáleného spouštění kódu. Můžete implementovat server, který registruje objekt služby pomocí registru Java RMI. Klienti mohou dotazovat registr a získat stub objektu služby pro vyvolání metod služby. Jak ukazuje tento příklad, je to všechno docela jednoduché.

Používáte ve svém projektu Java RMI? Jaké máte zkušenosti? Zkoumali jste nějaké alternativy? Dejte nám prosím vědět v níže uvedených komentářích.

Podíl Podíl tweet E-mailem Průvodce pro začátečníky k animované řeči

Animační řeč může být výzva. Pokud jste připraveni začít s přidáváním dialogu do svého projektu, proces za vás rozdělíme.

Číst dále
Související témata
  • Programování
  • Jáva
O autorovi Jay Sridhar(17 článků zveřejněno) Více od Jaye Sridhar

Přihlaste se k odběru našeho zpravodaje

Připojte se k našemu zpravodaji a získejte technické tipy, recenze, bezplatné elektronické knihy a exkluzivní nabídky!

Kliknutím sem se přihlásíte k odběru