IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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é.

vytvorenie rozhrania - RMI - Remote Method Invocation

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

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);
    }
}
ServerRMI v Jave - RMI - Remote Method Invocation

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");
    }
}
KlientRMI - 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 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.

ExportJAR - RMI - Remote Method Invocation

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.

ExportJAR v Java RMI - RMI - Remote Method Invocation

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.

Vypis a RMI registre - RMI - Remote Method Invocation

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.

StartServerRMI - RMI - Remote Method Invocation

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.

StartKlientRMI - RMI - Remote Method Invocation

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 podmienkami

Stiahnuté 457x (10.54 kB)

 

Predchádzajúci článok
Java RMI - Vysvetlenie pojmov a opis tried
Všetky články v sekcii
RMI - Remote Method Invocation
Preskočiť článok
(neodporúčame)
Java RMI - Príklad s CMD cez LAN, MAN, WAN
Č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