Professional Documents
Culture Documents
Komunikacija izmeu klijenta i servera omoguena je preko interfejsa. Protokol koji se koristi za komunikaciju zove se JRMP (Java Remote Method Protocol) . Dve automatski generisane klase implementiraju ovaj protokol:
Stub klasa na klijentu Skeleton klasa na serveru
Client object
Client stub
RMI object
RMI komunikacija
Java RMI omoguava poziv metoda objekata koji su vezani za razliite Java virtuelne maine (JVM). Java virtuelne maine mogu biti na razliitim raunarima, ili na jednom raunaru. U oba sluaja metod objekta se izvrava u drugom adresnom prostoru u odnosu na program klijent. Klijent je program koji poziva metod udaljenog objekta, a server sadri taj objekat. Tri entiteta su ukljuena u izvrenje programa koji koristi RMI: Klijent koji poziva metod udaljenog objekta Server koji sadri udaljeni objekat Registar objekata (rmiregistry) koji povezuje objekte sa imenima, tj. u kome se registruju objekti
RMI komunikacija
Rmiregistry se izvrava na poznatom portu (1099-po defaultu) . Server po startovanju registruje svoje objekte u registru objekata preko simbolikog imena Klijent pre poziva metoda mora prvo da kontaktira registar objekata da bi dobio pristup udaljenom objektu Podrku u ovoj komunikaciji pruaju
Stub class koja slui za odgovarajue marshal-ovanje parametara i slanje poruke preko mree, kao i za primanje poruke i unmarshalovanje rezultata Skeleton class prima poruku i unamarshal-uje parametre i prosleuje ih server objektu koji izvrava metod i vraa rezultat skeletonu koji ga marshal-uje i alje poruku preko mree.
extends java.rmi.Remote {
throws java.rmi.RemoteException;
3. Stub i skeleton
U starim verzijama Jave, RMI kompajler (rmic) se koristio za generisanje stuba i skeletona. U verziji 1.5, ove klase se generiu dinamiki i rmic se ne koristi.
4. Host server
U okviru ovog programa obavlja se kreiranje i registrovanje remote objekta u registru objekata (rmiregistry) koji se nalazi na lokalnom hostu i slua na portu 1099. Registrovanje se obavlja pozivom metoda klase java.rmi.Naming:
Naming.rebind(object_name, object) gde je object_name String koji imenuje udaljeni objekat, a object je udaljeni objekat koji se registruje
CalculatorServer.java
import java.rmi.Naming; public class CalculatorServer { public CalculatorServer() { try { Calculator c = new CalculatorImpl(); }
Naming.rebind("rmi://localhost:1099/CalculatorService", c);
5.Klijent
Klijent je program koji poziva udaljeni metod. Da bi to uradio klijent koristi referencu na udaljeni objekat (object handle). Za to je potrebno znati: 1.Adresu maine na kojoj se izvrava rmiregistry u kome se registruje udaljeni objekat 2. Port na kome se rmiregistry izvrava (ako je 1099 moe se izostaviti) 3. Ime objekta u rmiregistry-ju Klijent u u ovu svrhu koristi lookup metod klase java.rmi.Naming. Povratna vrednost iz ovog metoda mora biti cast-ovana u tip remote interfejs
CalculatorClient.java Calculator c = (Calculator) Naming.lookup( "rmi://localhost /CalculatorService"); System.out.println( c.sub(4, 3) ); System.out.println( c.add(4, 5) ); System.out.println( c.mul(3, 6) ); System.out.println( c.div(9, 3) );
Calculator-kod
public interface Calculator extends java.rmi.Remote { public long add(long a, long b) throws java.rmi.RemoteException; public long sub(long a, long b) throws java.rmi.RemoteException; public long mul(long a, long b) throws java.rmi.RemoteException;
import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class CalculatorImpl extends UnicastRemoteObject implements Calculator { public CalculatorImpl() throws RemoteException{ super(); } public long add(long a, long b) throws RemoteException { } return a + b;
return a * b;
return a / b;
import java.io.IOException; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.RemoteException; public class CalculatorServer { public CalculatorServer(String host, String port, String service) { try {
} catch (MalformedURLException malformedException) { System.err.println( "Failure during Name registration: " + malformedException); }
} catch (RemoteException remoteException) { System.err.println( "Failure during object export to RMI: " + remoteException);
Calculator c = new CalculatorImpl(); Naming.rebind("rmi://" + host + ":" + port + "/" + service, c);
} }
try { Calculator c = (Calculator) Naming.lookup("rmi://" + host + ":" + port + "/" + service); System.out.println( System.out.println( System.out.println( System.out.println( c.sub(4, 3) ); c.add(4, 5) ); c.mul(3, 6) ); c.div(9, 3) );
catch (MalformedURLException murle) { System.out.println(); System.out.println( "MalformedURLException"); System.out.println(murle); } catch (RemoteException re) { System.out.println(); System.out.println( "RemoteException"); System.out.println(re); } catch (NotBoundException nbe) { System.out.println(); System.out.println( "NotBoundException"); System.out.println(nbe); } catch ( java.lang.ArithmeticException ae) { System.out.println(); System.out.println( "java.lang.ArithmeticException"); System.out.println(ae); } } }
serijalizacija
object
serialization
byte stream
byte stream
JVM 1
Prenos parametara
Ako se serializable objekat prosledjuje kao parametar (ili povratna vrednost) poziva udaljenog metoda, onda se vrednost objekta prenosi iz jednog adresnog prostora u drugi. Podaci primitivnih tipova i lokalni objekti se prenose kao serializable. Ako se objekat remote klase prosledjuje kao parametar (ili povratna vrednost) onda se referenca na objekat (object handle) prenosi iz jednog iz jednog adresnog prostora u drugi U primeru Calculator prenose se podaci primitivnih tipova, tj. po vrednosti