IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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.Remo­teException u metód, ktoré majú byť zdieľané.

Rozhranie RMI objektu - RMI - Remote Method Invocation

2) Programovanie serverovej časti

Najskôr si vytvoríme zdieľaný objekt (ObjektRMI.java), ktorý dedí od java.rmi.server­.UnicastRemote­Object a zároveň implementuje naše navrhnuté rozhranie rozhrani.Rozhra­niRMI04. 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);
    }
}
Java RMI Objekt - RMI - Remote Method Invocation

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 "SdilenyObjek­t04".

Jediná zmena oproti predchádzajúcim príkladom je to, že nevykonávame binding (zaregistrovanie) cez objekt rozhranie registrov java.rmi.regis­try.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 ...");
    }
}
Java RMI Server - RMI - Remote Method Invocation

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");
    }
}
Java RMI klient - RMI - Remote Method Invocation

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.

IP server - RMI - Remote Method Invocation

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.

Spustenie Java RMI servera - RMI - Remote Method Invocation

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.

Spustenie Java RMI klienta - RMI - Remote Method Invocation

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.

Výsledok RMI servera - RMI - Remote Method Invocation

Pre istotu spustíme klienta ešte raz.

Spustíme Java RMI klienta - RMI - Remote Method Invocation

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ýsledok RMI Server druhý klient - RMI - Remote Method Invocation

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 podmienkami

Stiahnuté 480x (12.29 kB)

 

Predchádzajúci článok
Java RMI - Spustenie RMI Server / Klient cez CMD
Všetky články v sekcii
RMI - Remote Method Invocation
Preskočiť článok
(neodporúčame)
Java RMI - Pole primitívnych dátových typov
Článok pre vás napísal Robert Michalovič
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Programuji převážně v Javě SE,EE a trochu nativním C a CUDA. více viz.https://cz.linkedin.com/in/robert-michalovic
Aktivity