6. diel - Java RMI - Príklad s CMD cez LAN, MAN, WAN
V minulej lekcii kurzu o RMI v Jave sme obsluhovali našu aplikáciu z príkazového riadku. V dnešnej lekcii si vyskúšame zdieľanie základných dátových typov cez sieť LAN.
Príklad s CMD cez LAN, MAN, WAN
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 (port 1099), ale tentoraz si to vyskúšame na miestnej LAN. LAN je štandardne niekoľko PC spojených Wi-fi, nad ktorou dohliada router. Celá siet ide na TCP / IP vo formáte IPv4. Systém prideľovania IP adries je DHCP a IP adresy klientov sú rozsahu 192.168.2.101 - 192.168.2.120. Mohol by som ju nastaviť na plný rozsah siete typu C od 192.168.2.0 do 192.168.2.255, ale pretože sa jedná o domáce sít, nie je potreba toľko IP adries. Ako si všimnete, tak server RMI beží na IP: 192.168.2.101 a klient pobeží na 192.168.2.102.
V našom prípade sa samozrejme nemusíme obmedzovať iba na IP adresy v rámci LAN. Ak by sme server spustili na počítači s verejnou IP adresou do internetu (tzv. WAN), potom stačí nastaviť klientovi IP adresu servera na internete a všetko by malo fungovať tiež. Teda za predpokladu, že z klienta budete schopní dosiahnuť pripojenie na IP daného RMI servera. V niektorých prípadoch to býva zablokované na routeri alebo firewallom na LAN, kde beží klient.
Osnova dnešnej lekcie bude nasledujúci:
- 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 Java SE projekt pre RMI server. Do tohto projektu si vytvoríme rozhranie, ktoré bude dediť od java.rmi.Remote. Do rozhrania si vložíme 4 metódy. Prvý bude opäť typu void pre kontrolné výpis. Zostávajúce budú mať návratové typy a parametre v hlavičkách. Druhá metóda prijme string, robí úpravu stringu na serveri a upravený string pošle späť na klienta. Tretia aj štvrtá toto vykonajú s primitívnymi dátovými typmi boolean a byte.
package rozhrani; public interface RozhraniRMI04 extends java.rmi.Remote { public void zavolejVOID() throws java.rmi.RemoteException; public String ziskejString(String s) throws java.rmi.RemoteException; public boolean ziskejBoolean(boolean bool) throws java.rmi.RemoteException; public byte ziskejUpravByte(byte bajt) throws java.rmi.RemoteException; }
Opätovne si všimnite throws java.rmi.RemoteException u metód, ktoré majú byť zdieľané.
2) Programovanie serverovej časti
Najskôr si vytvoríme zdieľaný objekt (ObjektRMI.java), ktorý dedí od java.rmi.server.UnicastRemoteObject a zároveň implementuje naše navrhnuté rozhranie rozhrani.RozhraniRMI04. Iba vyplníme tela metód. Robia to, čo sme si definovali na začiatku, keď sme tvorili danej rozhranie. Novinkou je len pridanie premennej triedy, ktorá bude uchovávať počet zavolanie metód.
package server; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class ObjektRMI extends UnicastRemoteObject implements rozhrani.RozhraniRMI04 { private static final long serialVersionUID = 1L; private int hodnota=0; protected ObjektRMI() throws RemoteException { super(); } public void zavolejVOID() throws RemoteException { hodnota++; System.out.println("Pocet volani metod na serveru :\t"+hodnota); } public String ziskejString(String s) throws RemoteException { hodnota++; System.out.println("Z klienta dorazil tento retezec : "+s); return "Upravime retezec na serveru "+s; } public boolean ziskejBoolean(boolean bool) throws RemoteException { hodnota++; System.out.println("Z klienta dorazil tento boolean : "+bool); return !bool; } public byte ziskejUpravByte(byte bajt) throws RemoteException { hodnota++; System.out.println("Z klienta dorazil tento byte(bajt) :"+bajt); return (byte)((byte) bajt+8); } }
Ako ďalší krok vykonáme vytvorenie triedy RMI servera (ServerRMI.java). Kód je veľmi jednoduchý. Najskôr vyrobíme inštanciu RMIServeru. Potom zavoláme inicializačnú metódu, ktorá ma za úlohu vytvoriť zdieľaný objekt. No a potom už prevedieme iba nahranie (zdieľaný, zaregistrovanie) zdieľaného RMI objektu do RMI registrov pod nejakým názvom (identifikátorom). Naším identifikátorom bude String "SdilenyObjekt04".
Jediná zmena oproti predchádzajúcim príkladom je to, že nevykonávame binding (zaregistrovanie) cez objekt rozhranie registrov java.rmi.registry.Registry, ale teraz to vykonávame cez mennú službu java.rmi.Naming. Prakticky je skoro jedno akú možnosť si vyberiete, fungujú obe.
package server; import java.net.*; import java.rmi.*; public class ServerRMI { private ObjektRMI sdilObjekt; private void initSdilenyObjekt(){ try { sdilObjekt = new ObjektRMI(); } catch (RemoteException e) { System.out.println("Nepodarilo se vytvorit sdileny objekt"); e.printStackTrace(); } } private void sdilejObjektRMI(){ try { Naming.bind("SdilenyObjekt04",sdilObjekt); } catch (MalformedURLException | RemoteException | AlreadyBoundException e) { System.out.println("Nepodarilo se nahrat(zaregistrovat RMI objekt v rmiregistrech)"); e.printStackTrace(); } } public static void main(String[] args) { ServerRMI serverRMI = new ServerRMI(); serverRMI.initSdilenyObjekt(); serverRMI.sdilejObjektRMI(); System.out.println("RMI Server ceka ..."); } }
3) Programovanie klientskej časti
Teraz nás samozrejme čaká klientská časť. Ak ste si naprogramovali a
úspešne spustili predchádzajúce príklady, tak ste si museli všimnúť, že
je koncept klienta prakticky stále rovnaký. Klientovi je nutné opäť
zaistiť prístup k rozhraniu (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 URL zložené z
IP adresy, portu na ktorom beží RMI registre a identifikátora zdieľaného
objektu. Správna syntax URL pre RMI nášho príkladu je nasledujúci:
rmi://21.15.45.33:1099/SdilenyObjekt04
. Vo
všeobecnej definícii je to
rmi://IPv4:port/identifikátor
. Akonáhle sa nám
podarí získať zdieľaný objekt, už si len zavoláme jeho metódy.
package klient; import java.net.*; import java.rmi.*; import java.util.Scanner; import rozhrani.RozhraniRMI04; public class KlientRMI { private RozhraniRMI04 stubRMI; private void ziskameSdilenyObjekt(String s,int port) { // format "rmi://21.15.45.33:1099/SdilenyObjekt04" String lanString = "rmi://"+s+":"+port+"/SdilenyObjekt04"; try { stubRMI = (RozhraniRMI04) Naming.lookup(lanString); } catch (MalformedURLException | RemoteException | NotBoundException e) { System.out.println("Nepodarilo se ziskat sdileny RMI objekt"); e.printStackTrace(); } } private void zavolameSdileneMetody(Scanner key) { try { stubRMI.zavolejVOID(); System.out.print("Vlozte String : "); String s = key.nextLine(); System.out.println("Zde je upraveny string ze serveru : "+ stubRMI.ziskejString(s)); boolean b = false; System.out.println("Zde je inverzi Boolean : "+stubRMI.ziskejBoolean(b)); byte bajt = (byte) 58; System.out.println("Zde je upraveny byte : "+stubRMI.ziskejUpravByte(bajt)); stubRMI.zavolejVOID(); } catch (RemoteException e) { System.out.println("Nepodarilo se zavolat sdilene metody"); e.printStackTrace(); } } public static void main(String[] args) { System.out.println("Start RMI Klienta"); KlientRMI klient = new KlientRMI(); Scanner key = new Scanner(System.in); System.out.print("Zadejte IPv4 ve formatu napr. 45.112.35.55 a stisknete Enter :"); String s = key.nextLine(); klient.ziskameSdilenyObjekt(s,1099); klient.zavolameSdileneMetody(key); System.out.println("Konec RMI 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 aplikácia pri spustení 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 je ukázaný v predchádzajúcej kapitole.
5) Spustenie RMI registra, RMI servera, RMI klienta a kontrola výstupov
Teraz si spustíme na PC, kde máme v pláne spustiť RMI server, príkazový riadok a vyvoláme výpis "ipconfig -all". Tento výpis nám ukáže IP adresu nášho PC v sieti. Samozrejme spôsobov ako zisti IP adresu je celý rad. V našom prípade je IP adresa počítača, na ktorom pobeží server: 162.168.2.101.
Zaiste ste si všimli, že export som vykonal priamo do roote disku e: \. Ako prvý pred spustením servera je nutné zaistiť prístup ku skompilovať triede rozhranie nášho serveru. To docielime tým, že nakopírujeme * .class skompilovanej rozhranie na úroveň disku e: \. Možno to krásne vidieť pri výpise "dir rozhranie". Výpisy "dir" sú pre prehľad štruktúry. Potom spustíme RMI registre "štart rmiregistry".
Teraz spustíme RMI server. To docielime príkazom "java -jar RMIServer04.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 nás čaká spustenie RMI klienta. Opäť sme vykonali spustenie príkazového riadku a zadali "ipconfig -all". Ako vidíte, IP adresa počítača, na ktorom pobeží klient, je 162.168.2.102. Teraz spustíme RMI klienta príkazom "java -jar RMIKlient04.jar klient.KlientRMI". Výpis na konzole ukazuje spustenie klienta a získanie súčtu zo servera.
Presunieme sa na PC, kde bežia RMI server. Podľa konzolového výpisu komunikácie medzi klientom / serverom prebehla perfektne a bez chýb.
Pre istotu spustíme klienta ešte raz.
A opätovne vidíme, že server umožnil zavolanie zdieľaných metód. Samozrejme nám súhlasí aj počet zavolanie. Každý klient vykonal 5 volanie, spustenie 2 klienti, takže je to celkom 10 volanie.
V budúcom diele si vytvoríme príklad na pole primitívnych dátových typov.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkamiStiahnuté 480x (12.29 kB)