Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- RMI oznacza Remote Method Invocation (zdalne wywoływanie metod). Jest to mechanizm, który pozwala obiektowi znajdującemu się w jednym systemie (JVM) na dostęp/wywołanie metod obiektu działającego na innym JVM. RMI służy do budowania aplikacji rozproszonych; zapewnia zdalną komunikację między programami Java. Jest on dostarczany w pakiecie java.rmi
- W aplikacji RMI piszemy dwa programy:
- - program serwera - to tutaj jest tworzony obiekt zdalny, a odwołanie do tego obiektu jest udostępniane klientowi (za pomocą
- rejestru).
- - program klienta - program kliencki żąda zdalnych obiektów od serwera i próbuje wywołać jego metody.
- Schemat działania aplikacji RMI:
- 1. Gdy klient wywołuje zdalny obiekt, zostaje odebrany przez kod pośredniczący (STUB), który ostatecznie przekazuje to żądanie do
- listy RRL (lista RRL zarządza referencjami do zdalnych obiektów po stronie klienta).
- 2. Gdy RRL po stronie klienta odbierze żądanie, wywołuje metodę o nazwie invoke () obiektu remoteReference. Wywołanie tej metody
- przekazuje żądanie do RRL po stronie serwera.
- 3. RRL po stronie serwera przekazuje żądanie do Szkieletu (proxy na serwerze), który ostatecznie wywołuje wymaganą metodę obiektu na
- serwerze.
- 4. Wynik jest przekazywany z powrotem do klienta.
- Pakowanie i rozpakowywanie parametrów metod:
- Za każdym razem, gdy klient wywołuje metodę na obiekcie zdalnym, która akceptuje parametry, parametry te są pakowane w komunikat przed wysłaniem przez sieć. Te parametry mogą być typu pierwotnego lub obiektowego. W przypadku typu pierwotnego parametry są zestawiane i dołączany jest do nich nagłówek. Jeśli parametry są obiektami, są one serializowane. Ten proces jest znany jako marshalling.
- Po stronie serwera spakowane parametry są rozpakowywane, a następnie wywoływana jest wymagana metoda. Ten proces nazywa się unmarshalling .
- Rejestr RMI:
- Rejestr RMI to przestrzeń nazw, w której umieszczane są wszystkie obiekty serwera. Za każdym razem, gdy serwer tworzy obiekt, rejestruje ten obiekt w RMIregistry (używając metod bind () lub reBind () ). Są one rejestrowane przy użyciu unikalnej nazwy zwanej nazwą wiązania (bind name).
- Aby wywołać zdalny obiekt, klient potrzebuje odwołania do tego obiektu. W tym celu klient pobiera obiekt z rejestru za pomocą nazwy wiązania - bind name (przy użyciu metody lookup () ).
- Jak stworzyć aplikację RMI:
- 1. Definiujemy zdalny interfejs.
- 2. Tworzymy klasę obiektu zdalnego implementującą zdalny interfejs.
- 3. Tworzymy program serwera.
- 4. Tworzymy program klienta.
- Interfejs zdalny - zawiera deklarację wszystkich metod określonego obiektu zdalnego. Klient komunikuje się z tym zdalnym interfejsem.
- 1. Tworzymy iterfejs, który rozszerza interfejs Remote (należy do pakietu java.rmi).
- 2. Deklarujemy wszystkie metody, które klient może wywoływać na obiekcie zdalnym. Gdyż podczas połączenia zdalnych istnieje ryzyko
- wystąpienia problemów z siecią, może wystąpić wyjątek o nazwie RemoteException - należy go wyrzucić przez metodę
- */
- import java.rmi.Remote;
- import java.rmi.RemoteException;
- public interface Hello extends Remote {
- void printMsg() throws RemoteException;
- }
- /*
- Klasa obiektu zdalnego - musi implementować interfejs zdalny utworzony w poprzednim kroku. Jednocześnie definiuje wszystkie metody zadeklarowane w zdalnym interfejsie.
- */
- public class ImplExample implements Hello {
- public void printMsg() {
- System.out.println("This is an example RMI program");
- }
- }
- /*
- Program serwera - powinien powinien implementować zdalny interfejs lub rozszerzać klasę implementacji(czyli klasę zdalnego obiektu). To tutaj powinniśmy utworzyć zdalny obiekt i powiązać go z rejestrem RMI.
- 1. Tworzymy obiekt zdalny.
- 2. Eksportujemy zdalny obiekt za pomocą metody exportObject() z klasy UnicastRemoteObject, która należy do pakietu java.rmi.server.
- 3. Pobieramy rejestr RMI za pomocą metody getRegistry() z klasy LocateRegistry, która należy do pakietu java.rmi.registry. Metoda
- getRegistry() zwraca obiekt typu Registry.
- 4. Wiążemy zdalny obiekt z pobranym rejestrem za pomocą metody bind(). Jako pierwszy argument metoda przyjmuje nazwę zdalnego
- obiektu, a jako drugi referencję do zdalnego obiektu.
- */
- import java.rmi.registry.Registry;
- import java.rmi.registry.LocateRegistry;
- import java.rmi.RemoteException;
- import java.rmi.server.UnicastRemoteObject;
- public class Server extends ImplExample {
- public Server() {}
- public static void main(String args[]) {
- try {
- // stworzenie obiektu zdalnego
- ImplExample obj = new ImplExample();
- // eksportujemy zdalny obiekt
- Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);
- // pobieramy rejestr
- Registry registry = LocateRegistry.getRegistry();
- // wiążemy zdalny obiekt
- registry.bind("Hello", stub);
- System.err.println("Server ready");
- } catch (Exception e) {
- System.err.println("Server exception: " + e.toString());
- e.printStackTrace();
- }
- }
- }
- /*
- Program klienta
- 1. Pobieramy rejestr RMI za pomocą metody getRegistry () klasy LocateRegistry, która należy do pakietu java.rmi.registry. Metoda
- zwraca obiekt typu Registry.
- 2. Pobieramy obiekt zdalny z rejestru za pomocą metody lookup(). Do tej metody należy przekazać wartość ciągu reprezentującą nazwę
- zdalnego obiektu. Spowoduje to zwrócenie referencji do zdalnego obiektu.
- 3. Funkcja lookup () zwraca obiekt typu Remote, należy go zrzutować na typ Hello (interfejs zdalny).
- */
- import java.rmi.registry.LocateRegistry;
- import java.rmi.registry.Registry;
- public class Client {
- private Client() {}
- public static void main(String[] args) {
- try {
- // pobieramy rejestr
- Registry registry = LocateRegistry.getRegistry(null);
- // sprawdzanie rejestru i wyszukiwanie zdalnego obiektu
- Hello stub = (Hello) registry.lookup("Hello");
- // wywołanie zdalnej metody
- stub.printMsg();
- System.out.println("Remote method invoked");
- } catch (Exception e) {
- System.err.println("Client exception: " + e.toString());
- e.printStackTrace();
- }
- }
- }
Add Comment
Please, Sign In to add comment