5. diel - Java RMI - Spustenie RMI Server / Klient cez CMD
V minulej lekcii o Java RMI sme si vysvetlili dôležité pojmy a popísali triedy, ktoré budeme na komunikáciu používať. V tejto lekcii si vytvoríme RMI klienta a server v IDE. Spustenie prevedieme priamo cez príkazový riadok a to ako RMI registra, tak servera i klienta. Využijeme defaultný port a opäť budeme na localhost. Pretože nepoužijeme RMI registre cez IDE, nie je tu pre daný projekt nutné upravovať. Osnova tvorby projektu bude opäť identická. Ako server tak aj klient už budú mať vlastný projekt.
- Naprogramujeme si rozhranie pre zdieľané objekty, ktoré budeme cez RMI zdieľať
- Naprogramujeme serverovú časť
- Naprogramujeme klientskú časť
- Skompilujeme, zbuildujeme a vyexportuje projekty
- Spustíme RMI registre, RMI server, RMI klienta a skontrolujeme výstupy
1) Programovanie rozhranie pre zdieľané objekty
Ako prvý krok si vytvoríme SE projekt. Do tohto projektu si vytvoríme
rozhrania ktoré bude dediť od java.rmi.Remote. Do rozhrania si vložíme dve
metódy. Prvý bude opäť typu void a druhá s návratovým typom a parametre,
kde bude prenášať primitívne dátové typy (int
) z klienta na
server. Na serveri dôjde na výpočet a potom výslednú hodnotu prenesieme
späť 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šimnite si, že aj metódy umiestnené v rozhraní musí obsahovať
throws java.rmi.RemoteException
, čo samozrejme platí pre všetky
metódy, ktoré majú byť zdieľané.
2) Programovanie serverovej časti
Ako ďalší krok vykonáme vytvorenie triedy RMI Servera (ServerRMI.java) a triedy RMI vzdialeného objektu (tzv. Zdieľaného objektu ObjektRMI.java). V prvom aj druhom príklade sme z dôvodu zjednodušenia využili schopnosti Javy a RMI servera a zdieľaný objekt RMI bola prakticky jedna a tá istá trieda. Teraz sme si rozdelili úlohy a každá trieda má svoju špecifickú funkciu. Väčšinou sa používa toto riešenie, ale pre schopného vývojárov je to vlastne jedno.
Čo vlastne na serveri robíme? Stále to isté. Vygenerujeme (vytvoríme) objekt (inštanciu) zdieľaného objektu. Získame objekt registrov a potom do registrov zdieľaný objekt nahráme (zaregistrujeme) pod nejakým názvom (identifikátorom). Naším identifikátorom 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 ... "); } }
Tu si ukážeme obsah triedy zdieľaného objektu. Všimnite si povinnosti vygenerovať protected konštruktor. Obsah metód netreba komentovať, sú vážne triviálne.
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) Programovanie klientskej časti
Najskôr si samozrejme musíme vytvoriť projekt pre klienta. Do tohto
projektu je nutné zaistiť prístup k rozhranie, ktoré sa nachádza v serveru.
Najjednoduchšou cestou bude ho skopírovať (CTRL + C a CTRL + V) z projektu
servera do projektu klienta. Potom si samozrejme vytvoríme obyčajnú
spúšťací triedu s public static void main(String args)
metódou. V tejto triede opäť zavoláme Naming triedu s metódou
lookup()
, kde parameter bude identifikátor zdieľaného objektu.
Akonáhle sa nám to podarí, zavoláme si metódy zdieľaného objektu.
Volanie RMI metód musí prebiehať v try-catch bloku. Ovšem pretože sa
jedná o jednoduchý príklad, umiestnil som namiesto toho throws
priamo do main () metódy.
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) Kompilácia, buildování a export projektov
Teraz vykonáme skompilovaniu a prípadne i spustenie. Samozrejme, pokiaľ nie sú spustené RMI registre s nastavením spusteného projektu, tak spustenie programu v konzole vyvolá výnimky. Podstatné je, že je to skompilovanej a máme vytvorenú spúšťacie konfiguráciu a potom vykonáme export. Export projektu vykonáme tak, že označíme projekt a stlačíme pravé tlačidlo myši. Objaví sa kontextové menu, kde vyberieme podľa screenshotu nižšie Export. Potom si v dialógu nájdeme možnosť Java - Runnable jar.
Objaví sa ďalší dialóg, kde si vyberieme spúšťací konfiguráciu (launch configuration), ktorá je k dispozícii iba ak sme program v IDE spustili (i neúspešne). Potom si vyberieme miesto exportu a tiež meno * .jar súboru. To isté potom samozrejme urobíme aj pre RMI klienta, aby sme ho mohli aj so serverom spustiť z príkazového riadku.
5) Spustenie RMI registre, RMIServer, RMIKlienta a kontrola výstupov
Zaiste ste si všimli, že export som vykonal priamo do roote disku
e:\
. Ako prvý pred spustením servera je nutné zaistiť
skompilovanú triedu rozhrania daným projektom. To docielime nakopírováním *
.class zkompilovaného rozhrania na disk e: \. Možno to krásne vidieť pri
výpise " dir rozhrani
". Výpis "dir" sú pre získanie obsahu,
teda štruktúry zložky. Potom spustíme RMI registre
start rmiregistry
.
Teraz spustíme RMI server príkazom
start java -jar RMIServer03.jar server.ServerRMI
.
Ak existuje skompilovanej rozhranie, ku ktorému má spustený * .jar prístup,
spustenie prebehne v poriadku. Ak neexistuje, výpis vyvolá výnimku.
Teraz spustíme RMI klienta príkazom
java -jar RMIKlient03.jar klient.KlientRMI
. Výpis
na konzole ukazuje spustenie klienta a získanie súčtu zo servera. Výpis
konzole servera ukazuje, že klient dvakrát zavolal metódu výpisu na serveri
a možno vidieť, že vykonal súčet.
V budúcom diele si vytvoríme príklad fungujúce na LAN. Zdrojové kódy sú priložené pod článkom.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkamiStiahnuté 486x (10.54 kB)