Lekce 5 - Java RMI - Spuštění RMI Server/Klient přes CMD
V minulé lekci o Java RMI, Java RMI - Vysvětlení pojmů a popis tříd, jsme si vysvětlili důležité pojmy a popsali třídy, které budeme ke komunikaci používat.
V této lekci si vytvoříme RMI klienta a server v IDE. Spuštění provedeme přímo přes příkazový řádek a to jak RMI registru, tak serveru i klienta. Využijeme defaultní port a opět budeme na localhostu. Protože nepoužijeme RMI registry přes IDE, není je zde pro daný projekt nutné upravovat. Osnova tvorby projektu bude opět identická. Jak server tak i klient již budou mít vlastní projekt.
- Naprogramujeme si rozhraní pro sdílené objekty, které budeme přes RMI sdílet
- Naprogramujeme serverovou část
- Naprogramujeme klientskou část
- Zkompilujeme, zbuildujeme a vyexportujeme projekty
- Spustíme RMI registry, RMI server, RMI klienta a zkontrolujeme výstupy
1) Programování rozhraní pro sdílené objekty
Jako první krok si vytvoříme SE projekt. Do tohoto projektu si vytvoříme
rozhraní které bude dědit od java.rmi.Remote. Do rozhraní si vložíme dvě
metody. První bude opět typu void a druhá s návratovým typem a parametry,
kde bude přenášet primitivní datové typy (int
) z klienta na
server. Na serveru dojde k provedení výpočtu a pak výslednou hodnotu
přeneseme zpět na klienta.
package rozhrani; public interface RozhraniRMI03 extends java.rmi.Remote { public void zavolameMetoduVypis() throws java.rmi.RemoteException; public int provedemeSoucet(int cislo1,int cislo2) throws java.rmi.RemoteException; }
Všimněte si, že i metody umístěné v rozhraní musí obsahovat
throws java.rmi.RemoteException
, což samozřejmě platí pro
všechny metody, které mají být sdíleny.

2) Programování serverové části
Jako další krok provedeme vytvoření třídy RMI Serveru (ServerRMI.java) a třídy RMI vzdáleného objektu (tzv. sdíleného objektu ObjektRMI.java). V prvním i druhém příkladu jsme z důvodu zjednodušení využili schopnosti Javy a RMI serveru a sdílený objekt RMI byla prakticky jedna a tatáž třída. Nyní jsme si rozdělili úlohy a každá třída má svou specifickou funkci. Většinou se používá toto řešení, ale pro schopného vývojáře je to vlastně jedno.
Co vlastně na serveru děláme? Pořád to samé. Vygenerujeme (vytvoříme) objekt (instanci) sdíleného objektu. Získáme objekt registrů a poté do registrů sdílený objekt nahrajeme (zaregistrujeme) pod nějakým názvem (identifikátorem). Naším identifikátorem bude String "SdilenyObjektProjekt3".
package server; import java.rmi.*; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class ServerRMI { private static ObjektRMI rmiObjekt; public static void main(String[] args) { System.out.println("Vytvorime sdileny objekt"); try { rmiObjekt = new ObjektRMI(); } catch (RemoteException e) { e.printStackTrace(); } System.out.println("Nahrajeme sdilený objekt do RMIregistru"); Registry registry = null; try { registry = LocateRegistry.getRegistry(); } catch (RemoteException e) { e.printStackTrace(); } try { registry.bind("SdilenyObjektProjekt3", rmiObjekt); } catch ( RemoteException | AlreadyBoundException e) { e.printStackTrace(); } System.out.println("Server Ceka ... "); } }
Zde si ukážeme obsah třídy sdíleného objektu. Všimněte si povinnosti vygenerovat protected konstruktor. Obsah metod není třeba komentovat, jsou vážně triviální.
package server; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import rozhrani.RozhraniRMI03; public class ObjektRMI extends UnicastRemoteObject implements RozhraniRMI03 { private static final long serialVersionUID = 1L; protected ObjektRMI() throws RemoteException { super(); } public void zavolameMetoduVypis() { System.out.println("Vypis na Serveru"); } public int provedemeSoucet(int cislo1, int cislo2) { return (cislo1+cislo2); } }

3) Programování klientské části
Nejdříve si samozřejmě musíme vytvořit projekt pro klienta. Do tohoto
projektu je nutno zajistit přístup k rozhraní, které se nachází v serveru.
Nejjednodušší cestou bude jej zkopírovat (CTRL + C a CTRL + V) z projektu
serveru do projektu klienta. Poté si samozřejmě vytvoříme obyčejnou
spouštěcí třídu s public static void main(String args)
metodou. V této třídě opět zavoláme Naming třídu s metodou
lookup()
, kde parametr bude identifikátor sdíleného objektu.
Jakmile se nám to podaří, zavoláme si metody sdíleného objektu.
Volání RMI metod musí probíhat v try-catch bloku. Ovšem protože se
jedná o jednoduchý příklad, umístil jsem místo toho throws
přímo do main() metody.
package klient; import java.net.*; import java.rmi.*; import rozhrani.RozhraniRMI03; public class KlientRMI { private static RozhraniRMI03 vzdalObj; public static void main(String[] args) throws RemoteException { System.out.println("Spustime klienta, ziskame sdileny objekt"); try { vzdalObj = (RozhraniRMI03) Naming.lookup("SdilenyObjektProjekt3"); } catch (MalformedURLException | RemoteException | NotBoundException e) { e.printStackTrace(); } System.out.println("Zavolame vypis na server"); vzdalObj.zavolameMetoduVypis(); System.out.println("Soucet 2+3=" + vzdalObj.provedemeSoucet(2,3)); System.out.println("Zavolame vypis na server"); vzdalObj.zavolameMetoduVypis(); System.out.println("Konec Klienta"); } }

4) Kompilace, buildování a export projektů
Nyní provedeme zkompilování a případně i spuštění. Samozřejmě, pokud nejsou spuštěné RMI registry s nastavením spouštěného projektu, tak spuštění programu v konzoli vyvolá výjimky. Podstatné je, že je to zkompilované a máme vytvořenou spouštěcí konfiguraci a poté provedeme export. Export projektu provedeme tak, že označíme projekt a stiskneme pravé tlačítko myši. Objeví se kontextové menu, kde vybereme dle screenshotu níže Export. Poté si v dialogu najdeme možnost Java - Runnable jar.

Objeví se další dialog, kde si vybereme spouštěcí konfiguraci (launch configuration), která je k dispozici pouze pokud jsme program v IDE spustili (i neúspěšně). Poté si vybereme místo exportu a také jméno *.jar souboru. To samé pak samozřejmě uděláme i pro RMI klienta, abychom jej mohli i se serverem spustit z příkazového řádku.

5) Spuštění RMI registry, RMIServer, RMIKlienta a kontrola výstupů
Zajisté jste si všimli, že export jsem provedl přímo do rootu disku
e:\
. Jako první před spuštěním serveru je nutno zajistit
zkompilovanou třídu rozhraní daným projektům. Toho docílíme
nakopírováním *.class zkompilovaného rozhraní na disk e:\. Lze to krásně
vidět při výpisu "dir rozhrani
". Vypisy "dir" jsou pro
získání obsahu, tedy struktury složky. Poté spustíme RMI registry
start rmiregistry
.

Nyní spustíme RMI server příkazem
start java -jar RMIServer03.jar server.ServerRMI
.
Pokud existuje zkompilované rozhraní, ke kterému má spuštěný *.jar
přístup, spuštění proběhne v pořádku. Pokud neexistuje, výpis vyvolá
výjimku.

Nyní spustíme RMI klienta příkazem
java -jar RMIKlient03.jar klient.KlientRMI
.
Výpis na konzole ukazuje spuštění klienta a získání součtu ze serveru.
Výpis konzole serveru ukazuje, že klient dvakrát zavolal metodu výpisu na
serveru a lze vidět, že provedl součet.

V příštím díle, Java RMI - Příklad s CMD přes LAN, MAN, WAN, si vytvoříme příklad fungující na LAN. Zdrojové kódy jsou přiloženy pod článkem.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkamiStaženo 523x (10.54 kB)