Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

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

Java Pro pokročilé RMI Java RMI - Spuštění RMI Server/Klient přes CMD

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci o Java RMI 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í

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ě

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

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

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

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

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

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

V příštím díle si vytvoříme příklad fungující na LAN. Zdrojové kódy jsou přiloženy pod článkem.


 

Stáhnout

Staženo 85x (10.54 kB)

 

 

Článek pro vás napsal Robert Michalovič
Avatar
Jak se ti líbí článek?
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-michalovi%C4%8D-8a9b9498
Aktivity (3)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!