Skola:spsRMI
Obsah |
Remote Method Invocation
RMI je technológia umožňujúca z jedného virtuálneho stroja (JVM) volať metódy objektov na inom virtuálnom stroji.[1]
"Hello world" príklad [2]
Najprv musíme vytvoriť interface, kde definujeme metódy ktoré budeme pomocou stub triedy volať na servri.
- HelloInterface.java
import java.rmi.*; public interface HelloInterface extends Remote{ public String say() throws RemoteException; }
Nasleduje serverová implementácia (Impl), všetky argumenty metód musia implementovať Serializable
- HelloImpl.java
import java.rmi.*; import java.rmi.server.*; public class HelloImpl extends UnicastRemoteObject implements HelloInterface { private static final long serialVersionUID = 2246055149601754603L; private String message; public HelloImpl (String msg) throws RemoteException { message = msg; } public String say() throws RemoteException { return message; } }
Serverová aplikácia vytvorí novú inštanciu impl triedy na ktorej sa budú volať metódy
- HelloServer.java
import java.rmi.Naming; public class HelloServer { public static void main (String[] argv) { try { Naming.rebind ("Hello", new HelloImpl ("Hello,From Roseindia.net pvt ltd!")); System.out.println ("Server is connected and ready for operation."); } catch (Exception e) { System.out.println ("Server not connected: " + e); } } }
Aplikácia klienta sa pripojí na server a zavolá metódu Say() na servri
- HelloClient.java
import java.rmi.Naming; public class HelloClient { public static void main (String[] argv) { try { HelloInterface hello =(HelloInterface) Naming.lookup ("//127.0.0.1/Hello"); System.out.println (hello.say()); } catch (Exception e){ System.out.println ("HelloClient exception: " + e);} } }
- Kompilácia a spustenie
~$ javac *.java
~$ rmic HelloImpl #vygeneruje triedu pre klienta
~$ rmiregistry & #v pozadi spustime registry aby sa mohli pripájať klienti
~$ java HelloServer
Server is connected and ready for operation.
█
~$ java HelloClient
Hello,From Roseindia.net pvt ltd!
~$ █
Java Beans
Bean je trieda, ktorá implementuje Serializable, má konštruktor s 0 parametrami a k jej inštančným premenným sa pristupuje pomocou getter-ov a setter-ov.[3] Keďže implementuje Serializable, je možné použiť ju ako argument alebo návratovú hodnotu pri vzdialených volaniach prostredníctvom RMI.
Úloha
S využitím RMI a Java Beans implementujte Diffie-Hellmanovu dohodu na symetrickom kľúči medzi klientom a servrom.
Príklad očakávaného výstupu:
~$ java -Djava.security.policy=policy -Djava.rmi.server.hostname=192.168.1.14 RMIdhServer
Tajne cislo b=15
Server ready...
A->[B]:
p=23
g=5
g^a mod p=8
[B]->A:
g^b mod p=19
Dohodnuty zdielany kluc:
g^ab mod p=2
█
~$ java RMIdhClient 192.168.1.14
Connecting to: rmi://192.168.1.14:80/RMIdhService
Tajne cislo a=6
[A]->B:
p=23
g=5
g^a mod p=8
B->[A]:
g^b mod p=19
Dohodnuty zdielany kluc:
g^ab mod p=2
~$ █