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

Lekce 5 - Java RMI - Spuštění RMI Server/Klient přes CMD

V minulé lekci o Java RMI, Java RMI - Vysvětlení pojmů a popis tříd, jsme si vysvětlili důležité pojmy a popsali třídy, které budeme ke komunikaci používat.

V této lekci si vytvoříme RMI klienta a server v IDE. Spuštění provedeme přímo přes příkazový řádek a to jak RMI registru, tak serveru i klienta. Využijeme defaultní port a opět budeme na localhostu. Protože nepoužijeme RMI registry přes IDE, není je zde pro daný projekt nutné upravovat. Osnova tvorby projektu bude opět identická. Jak server tak i klient již budou mít vlastní projekt.

  • Naprogramujeme si rozhraní pro sdílené objekty, které budeme přes RMI sdílet
  • Naprogramujeme serverovou část
  • Naprogramujeme klientskou část
  • Zkompilujeme, zbuildujeme a vyexportujeme projekty
  • Spustíme RMI registry, RMI server, RMI klienta a zkontrolujeme výstupy

1) Programování rozhraní pro sdílené objekty

Jako první krok si vytvoříme SE projekt. Do tohoto projektu si vytvoříme rozhraní které bude dědit od java.rmi.Remote. Do rozhraní si vložíme dvě metody. První bude opět typu void a druhá s návratovým typem a parametry, kde bude přenášet primitivní datové typy (int) z klienta na server. Na serveru dojde k provedení výpočtu a pak výslednou hodnotu přeneseme zpět 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šimněte si, že i metody umístěné v rozhraní musí obsahovat throws java.rmi.RemoteException, což samozřejmě platí pro všechny metody, které mají být sdíleny.

Vytvoření rozhraní - RMI - Remote Method Invocation

2) Programování serverové části

Jako další krok provedeme vytvoření třídy RMI Serveru (ServerRMI.java) a třídy RMI vzdáleného objektu (tzv. sdíleného objektu ObjektRMI.java). V prvním i druhém příkladu jsme z důvodu zjednodušení využili schopnosti Javy a RMI serveru a sdílený objekt RMI byla prakticky jedna a tatáž třída. Nyní jsme si rozdělili úlohy a každá třída má svou specifickou funkci. Většinou se používá toto řešení, ale pro schopného vývojáře je to vlastně jedno.

Co vlastně na serveru děláme? Pořád to samé. Vygenerujeme (vytvoříme) objekt (instanci) sdíleného objektu. Získáme objekt registrů a poté do registrů sdílený objekt nahrajeme (zaregistrujeme) pod nějakým názvem (identifikátorem). Naším identifikátorem 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 ... ");
    }
}

Zde si ukážeme obsah třídy sdíleného objektu. Všimněte si povinnosti vygenerovat protected konstruktor. Obsah metod není třeba komentovat, jsou vážně triviální.

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 Javě - RMI - Remote Method Invocation

3) Programování klientské části

Nejdříve si samozřejmě musíme vytvořit projekt pro klienta. Do tohoto projektu je nutno zajistit přístup k rozhraní, které se nachází v serveru. Nejjednodušší cestou bude jej zkopírovat (CTRL + C a CTRL + V) z projektu serveru do projektu klienta. Poté si samozřejmě vytvoříme obyčejnou spouštěcí třídu s public static void main(String args) metodou. V této třídě opět zavoláme Naming třídu s metodou lookup(), kde parametr bude identifikátor sdíleného objektu. Jakmile se nám to podaří, zavoláme si metody sdíleného objektu.

Volání RMI metod musí probíhat v try-catch bloku. Ovšem protože se jedná o jednoduchý příklad, umístil jsem místo toho throws přímo do main() metody.

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) Kompilace, buildování a export projektů

Nyní provedeme zkompilování a případně i spuštění. Samozřejmě, pokud nejsou spuštěné RMI registry s nastavením spouštěného projektu, tak spuštění programu v konzoli vyvolá výjimky. Podstatné je, že je to zkompilované a máme vytvořenou spouštěcí konfiguraci a poté provedeme export. Export projektu provedeme tak, že označíme projekt a stiskneme pravé tlačítko myši. Objeví se kontextové menu, kde vybereme dle screenshotu níže Export. Poté si v dialogu najdeme možnost Java - Runnable jar.

ExportJAR - RMI - Remote Method Invocation

Objeví se další dialog, kde si vybereme spouštěcí konfiguraci (launch configuration), která je k dispozici pouze pokud jsme program v IDE spustili (i neúspěšně). Poté si vybereme místo exportu a také jméno *.jar souboru. To samé pak samozřejmě uděláme i pro RMI klienta, abychom jej mohli i se serverem spustit z příkazového řádku.

ExportJAR v Java RMI - RMI - Remote Method Invocation

5) Spuštění RMI registry, RMIServer, RMIKlienta a kontrola výstupů

Zajisté jste si všimli, že export jsem provedl přímo do rootu disku e:\. Jako první před spuštěním serveru je nutno zajistit zkompilovanou třídu rozhraní daným projektům. Toho docílíme nakopírováním *.class zkompilovaného rozhraní na disk e:\. Lze to krásně vidět při výpisu "dir rozhrani". Vypisy "dir" jsou pro získání obsahu, tedy struktury složky. Poté spustíme RMI registry start rmiregistry.

Vypis a rmi registry - RMI - Remote Method Invocation

Nyní spustíme RMI server příkazem start java -jar RMIServer03.jar server.ServerRMI . Pokud existuje zkompilované rozhraní, ke kterému má spuštěný *.jar přístup, spuštění proběhne v pořádku. Pokud neexistuje, výpis vyvolá výjimku.

StartServerRMI - RMI - Remote Method Invocation

Nyní spustíme RMI klienta příkazem java -jar RMIKlient03.jar klient.KlientRMI . Výpis na konzole ukazuje spuštění klienta a získání součtu ze serveru. Výpis konzole serveru ukazuje, že klient dvakrát zavolal metodu výpisu na serveru a lze vidět, že provedl součet.

StartKlientRMI - RMI - Remote Method Invocation

V příštím díle, Java RMI - Příklad s CMD přes LAN, MAN, WAN, si vytvoříme příklad fungující na LAN. Zdrojové kódy jsou přiloženy pod článkem.


 

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 455x (10.54 kB)

 

Předchozí článek
Java RMI - Vysvětlení pojmů a popis tříd
Všechny články v sekci
RMI - Remote Method Invocation
Přeskočit článek
(nedoporučujeme)
Java RMI - Příklad s CMD přes LAN, MAN, WAN
Článek pro vás napsal Robert Michalovič
Avatar
Uživatelské hodnocení:
Ještě nikdo nehodnotil, buď první!
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