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

2. diel - Java RMI - Volanie void metód

V minulej lekcii o Java RMI sme si technológiu uviedli a pripravili službu a projekt. V dnešnej lekcii si vykonáme prvý praktický príklad.

Ak ste prešli do tohto dielu z dielu predchádzajúceho, v ktorom ste nastavovali RMI registre v Eclipse, bolo by vhodné reštartovať PC. Niektoré Windows bez toho môžu robiť problémy. On je prakticky dobrý zvyk reštartovať PC po každom vykonávanom nastavenia vo Windows. Avšak by bolo vhodné, aby ste si vytvorili ešte jedny RMI registre a nevyplnený argument (port). Tým získame defaultný registre. Na nižšie uvedenom obrázku sú síce 3 RMI registre, ale teraz majte len 2 pre defaultný port 1099 a pre port 2020).

Nastavenie RMI registre - RMI - Remote Method Invocation

Ako prvý príklad si vytvoríme variantu "konzolová aplikácie server / klient", kedy klient bude volať metódu na serveri. Všetko budeme simulovať na localhost. Príklad pre LAN si predvedieme v ďalších lekciách. Použijeme na to defaultný RMI registre, bežiaci na porte 1099. Celý postup sa prakticky skladá zo 4 krokov, ktoré si tu uvedieme.

  • Naprogramujeme rozhranie pre objekt, ktorý budeme cez RMI zdieľať
  • Naprogramujeme serverovú časť, spustíme RMI registre a spustíme server (vytvoríme skeleton)
  • Naprogramujeme klientskú časť a spustíme klienta (vytvoríme stub)
  • Sledujeme a kontrolujeme výstupy

Programovanie rozhranie pre zdieľaný objekt

Každý objekt (inštancia), ktorý chceme zdieľať spory RMI registre, musí disponovať rozhraním java.rmi.Remote. Je to požiadavkou Java API, nemožno nasdílet cez RMI objekt, ktorý dané rozhranie nebude mať implementované. Pokiaľ má objekt disponovať metódami, ktoré chceme volať z klienta / servera, musíme ich definovať v rozhraní, ktoré z tohto rozhrania dedia. Prakticky vlastne potom vytvoríme objekt (stub / skeleton) typu rozhrania, ktorý nám práve umožňuje volať metódy v rozhraní špecifikované.

Vytvorenie rozhrania pre Java RMI - RMI - Remote Method Invocation

Kód bude nasledujúci:

package rozhrani;

public interface VolaneRozhrani extends java.rmi.Remote {
    void volameRMI() throws java.rmi.RemoteException;
}

Programovanie serverovej časti, spustenie RMI registre a spustenie servera

Ako ďalšie vytvoríme triedu (napr. Class ServerVoid), ktorá bude implementovať vyššie uvedené rozhranie. Tým docielime to, že môžeme inštanciu (skeleton) danej triedy nahrať (zaregistrovať) do RMI registrov, čo umožní každému, kto si vytvorí objekt (stub) cez tieto RMI registre získať daný objekt a volať jeho metódy. Server je obyčajná Java trieda so štandardnou public static void main () metódou a je potrebné ju tak aj spustiť.

/*  Program potřebuje registry na defaultním portu 1099  */
package server;
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.UnicastRemoteObject;
import rozhrani.VolaneRozhrani;

public class ServerVoid implements rozhrani.VolaneRozhrani {

    public void volameRMI() throws RemoteException {
        System.out.println("Ahoj, prave jsme zavolali metodu JVM serveru z klienta");
    }

    public static void main(String[] args) {
        System.out.println("Spustime RMI server");
        // vytvoříme objekt s implementovaným rozhraním
        ServerVoid obj = new ServerVoid();
        // vytvoříme objekt typu rozhraní (tzv. skeleton)
        VolaneRozhrani rozhObjekt = null;
        try {
            rozhObjekt = (VolaneRozhrani) UnicastRemoteObject.exportObject(obj,0);
        } catch (RemoteException e) {
            System.out.println("Nepodarilo se nam vytvorit objekt rozhrani");
            e.printStackTrace();
        }
        System.out.println("Program startuje - ulozime (nahrajeme) objekt do RMI registru");
        // získáme objekt RMI registrů
        Registry registry =null;
        try {
            registry = LocateRegistry.getRegistry();
        } catch (RemoteException e) {
            System.out.println("Nepodarilo se ziskat objekt RMI registru");
            e.printStackTrace();
        }
        // nahrajeme skeleton do registru
        try {
            registry.bind("IdentifikatorObjektuRMIregistru",rozhObjekt);
        } catch (RemoteException | AlreadyBoundException e) {
            System.out.println("Nepodarilo se nahrat skeleton do registru");
            e.printStackTrace();
        }
        System.out.println("Cekame na volani klienta");
    }
}

Tu si rozoberieme čo vlastne zdrojový kód robí. V prvej časti si vytvoríme objekt (inštanciu) danej serverovej triedy s implementovaným rozhraním, ktorý budeme zdieľať cez RMI. V druhej časti tento objekt pripravíme pre vzdialené volanie. Mechanizmus výnimiek rozoberať nebudem, nie je to predmetom tohto článku. Potom získame objekt RMI registrov a v poslednej časti objekt pre zdieľanie vzdialeného volania nahráme do RMI registrov a definujeme mu nejaký identifikátor. Bez identifikácia samozrejme nie je možné ho z klienta nájsť.

Keď už sme si naprogramovali server a máme vytvorené RMI registre, tak si RMI registre na defaultným porte 1099 spustíme a po nich spustíme aj server.

Spustíme RMI registre - RMI - Remote Method Invocation

Ako vidíte, v konzole výpise sú registre aj server spustené. Pre prácu v sieti na localhost je vhodné využívať ikonku monitora vpravo dole. Táto ikonka umožňuje prepínať medzi rôznymi konzolami. Tým si zabezpečíme výpis konzoly pre každý spustený program v IDE. Teraz si každý klient, ktorý bude poznať identifikátor zdieľanej inštancie (skeletonu), môže vytvoriť vzdialenú inštanciu (stub) a rozkázať mu zavolanie danej metódy.

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

Programovanie klientskej časti a spustenie klienta

Ako ďalšie vytvoríme triedu klienta (napr. Class KlientVoid). Ako ste si všimli, ide o štandardnú triedu so štandardnou public static void main () metódou a je potrebné ju tak aj spustiť.

Programujeme RMI klienta v Jave - RMI - Remote Method Invocation

Kód bude skutočne veľmi jednoduchý. Najskôr získame objekt RMI registrov. Potom si vytvoríme zdieľaný objekt rozhranie (stub) cez RMI registre. K tomu potrebujeme identifikátor, ktorý sme použili na serveri. No a potom konečne máme objekt, ktorý disponuje našou metódou, ktorú sme si definovali v rozhraní. Tu práve vidíte krásu a výhodu RMI. Klient si jednoducho zavolá metódu na serveri a server ju vykoná, nech sa mu to páči alebo nie.

/*  Program potřebuje registry na defaultním portu 1099  */
package klient;
import java.rmi.*;
import java.rmi.registry.*;
import rozhrani.VolaneRozhrani;
public class KlientVoid {

    public static void main(String[] args) {
        System.out.println("Spustime RMI klienta");
        Registry registry = null;
        try {
            registry = LocateRegistry.getRegistry();
        } catch (RemoteException e) {
            System.out.println("Nepodarilo se ziskat objekt registru");
            e.printStackTrace();
        }
        VolaneRozhrani rozhObjektKlient = null;
        try {
            rozhObjektKlient = (VolaneRozhrani) registry.lookup("IdentifikatorObjektuRMIregistru");
        } catch (RemoteException | NotBoundException e) {
            System.out.println("Nepodarilo se ziskat objekt stubu (rozhrani)");
            e.printStackTrace();
        }
            System.out.println("Zavolame si metodu na serveru");
        try {
            rozhObjektKlient.volameRMI();
        } catch (RemoteException e) {
            System.out.println("Nepodarilo se zavolat metodu na serveru");
            e.printStackTrace();
        }
        System.out.println("Ukoncime RMI klienta");
    }
}

Teraz si spustíme klienta. Klient prebehol a v konzole sa presvedčíme o vykonaných výpisoch. Zároveň si zobrazíme aj ikonu o konzolách. Možno vidieť celkom 3 konzoly. RmiRegistry, Server a Klienta.

Spustíme RMI Klienta - RMI - Remote Method Invocation

Tu sme si prepli konzolový výpis na server. Ako vidíte, objavil sa ďalší výpis. Áno, je to ten výpis, čo bol naprogramovaný v metóde, ktorú sme z klienta zavolali.

prepínanie konzoly - RMI - Remote Method Invocation

Zdrojové kódy sú priložené ďalej. V budúcej lekcii využijeme RMI registrov bežiacich na nedefaultním portu a aby sme to nemali tak jednoduché, tak oba programy budú plniť úlohu ako servera tak i klienta.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 15x (5.05 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Predchádzajúci článok
Java RMI - Nastavenie prostredia
Všetky články v sekcii
RMI - Remote Method Invocation
Preskočiť článok
(neodporúčame)
Java RMI - Volanie zo servera na porte 2020
Č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