JavaJava RMI

Pred zaciatkom prace je potrebne stiahnut J2SE SDK (download). Po nainstalovani je potrebne (alebo aspon odporucane) vlozit cestu k bin adresaru do cesty vo windowse.

Java RMI (Remote Mehod Invocation) vznikla povodne ako snaha vylepsit RPC (Remote Procesure Call) a obohatit ho o objektove crty a tym zlepsit a zjednodusit pracu programatorom. Pri pouzivani RMI sa skoro vobec nemusite starat o to, kde su ulozene parametre, s ktorymi narabate. K vzdialenym metodam mozete pristupovat rovnako, akoby boli ulozene na vasom pocitaci.

RMI sa sklada z viacerych vrstiev.
Vrstvy

Aplikacnu vrstvu zabezpecujete vy. Su to triedy a metody, ktore naprogramujete a chcete vzdialene vyuzivat. Na nizsej vrstve, ktoru zabezpecuje RMI su triedy Stub a Skeleton. Trieda Stub je akysi zastupca triedy urcenej na vzdialene pouzitie a jeho ulohou je zabezpecovat pretypovanie a spravne mapovanie predavanych parametrov, ako aj udrzovat vazby medzi volaniami klienta a pozadovanymi metodami. Trieda Skeleton je na strane klienta a sluzi ako nahrada vzdialenej triedy. Klient jej predava svoje poziadavky a Skeleton ich transformuje a posiela dalej. Uzivatelovi (programatorovi) sa javi, ako pozadovana trieda, no nachadza sa na lokalnom pocitaci. Dalsie nizsie vrstvy zabezpecuju komunikaciu medzi klientskym a serverovskym pocitacom.

Priklad 1

Najlepsie je vysvetlit pouzivanie RMI na priklade. Naprogramujeme si triedu Ahoj, ktora bude obsahovat metodu citajSpravu. Ta po zavolani vrati retazec znakov. Spristupnime ju pre vzdialene volania a potom sa pokusime precitat spravu z ineho pocitaca v sieti.

Najprv je potrebne zadefinovat si interface pre nasu tredu, ktory bude odvodeny od interfacu Remote:
import java.rmi.*;

interface Ahoj extends Remote {
  public String citajSpravu() throws RemoteException;
}
Vsetky metody, ktore bude mozne vzdialene volat musia mat moznost vyhodit vynimku RemoteException. Dalej je potrebne zadefinovat samotnu triedu a telo volanej metody.
import java.rmi.*;
import java.rmi.server.*;


public class AhojServer extends UnicastRemoteObject implements Ahoj {
  protected AhojServer() throws RemoteException {
    super();
  }

  public String citajSpravu() throws RemoteException {
     System.out.println("Niekto si precital spravu.");
     return "Toto je moja tajna sprava";
  }

  public static void main(String args[]) {
    System.setSecurityManager(new RMISecurityManager());
    try { 
      AhojServer obj = new AhojServer();
      Naming.rebind("AhojAhoj",obj);
      System.out.println("Cakam na precitanie spravy.");
    }
    catch (Exception e) { System.out.println(e.getMessage());} 
  }

}
V triede je potrebne zadefinovat konstruktor, hoci aj prazdny. Bez neho nie je mozne program skompilovat. V triede je aj metoda main, ktora najprv vytvori SecurityManager (vyznam tohto prikazu je nad ramec tejto prezentacie). Vytvorime si instanciu triedy a nasledne jej priradime jedinecne meno. V nasom pripade to je AhojAhoj. Toto meno potom bude jednoznacne urcovat nasu triedu. Zoznam mien je ulozeny v lokalnom registry (bude spominany nizsie). Ak uz bolo dane meno pouzite pre inu triedu, bude povodny odkaz vymazany a nahradeny nasou triedou.

Nakoniec je potrebne vytvorit klientsky program, ktory zavola vzdialenu metodu a vypise spravu na obrazovku.
import java.rmi.*;

public class AhojKlient {

  public static void main(String[] args) {
    System.setSecurityManager(new RMISecurityManager());

    try {
      Ahoj obj = (Ahoj)Naming.lookup("rmi://127.0.0.1/AhojAhoj");
      System.out.println(obj.citajSpravu());
    } 
    catch (Exception e1) { System.out.println(e1.getMessage()); }
  }
}
Program sa pokusi ziskat instanciu vzdialenej triedy na lokalnom pocitaci s nazvom AhojAhoj. Ak sa mu to podari, tak zavola jej metodu citajSpravu. Ak chcete zavolat metodu z ineho ako lokalneho pocitaca, zmente IP adresu 127.0.0.1 za adresu pozadovaneho pocitaca.

Kompilacia

Kedze vsetci poznate Javu, predpokladam, ze ste si vytvorili zdrojove subory so spravnymi nazvami. Teraz pristupime ku kompilacii a spusteniu. Cely proces nebude taky priamociary, ako to bolo s aplikaciami beziacimi len na lokalnom pocitaci. Prvy krok, kompilacia, prebehne rovnako:
javac *.java
Nasledne je potrebne vytvorit STUB objekty pre AhojServer. Java obsahuje program, ktory to spravi za nas. Ako parameter je mu potrebne zadat triedu, z ktorej ma STUB vygenerovat:
rmic AhojServer
Na disku by mali vzniknut dva nove class subory. Dalej je potrebne spustit RMI register. Je to aplikacia, ktora pocuva na nejakom specifikovanom porte a sprostredkuvava odovzdavanie tried. Aby sa dali vzdialene metody volat, je potrebne, aby na serverovskej casti bezala.
start rmiregister
Teraz nas uz caka posledny krok, zaregistrovanie nasej triedy do registra. Mozete si vyskusat spustit AhojServer:
java AhojServer
Pri zakladnom nastaveni by sa mal program ukoncit vynimkou. Je este potrebne zadefinovat pristupove prava k triede. V adresari, kde mate zdrojove subory si vytvorte subor policy a do neho napiste:
grant {	permission java.security.AllPermission;};
Server teraz mozete spustit prikazom:
java -Djava.security.policy=policy AhojServer
Na klientskom pocitaci je taktiez potrebne spustit klienta prikazom:
java -Djava.security.policy=policy AhojKlient
Je zaujimave nastavit si rozne osobne spravy a potom zistovat, ake spravy su nastavene na ostatnych pocitacoch.
Zdrojove subory k prvemu prikladu: RAR archiv.

Priklad 2

Druhy priklad sa od prveho velmi nelysi. Vasou ulohou je dokoncit metodu umocnuj tak, aby binarne umocnovala cislo a na cislo b modulo n. Zdrojove subory k druhemu prikladu: RAR archiv.
Valid HTML 4.0! Valid CSS! Optimalizovane pre vsetky prehliadace dodrzujuce normy a rozlisenie 1024x768.