krizen

Java RMI

Dec 27th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.45 KB | None | 0 0
  1. /*
  2. 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
  3.  
  4. W aplikacji RMI piszemy dwa programy:
  5. - program serwera - to tutaj jest tworzony obiekt zdalny, a odwołanie do tego obiektu jest udostępniane klientowi (za pomocą                                          
  6.   rejestru).
  7. - program klienta - program kliencki żąda zdalnych obiektów od serwera i próbuje wywołać jego metody.
  8.  
  9. Schemat działania aplikacji RMI:
  10.   1. Gdy klient wywołuje zdalny obiekt, zostaje odebrany przez kod pośredniczący (STUB), który ostatecznie przekazuje to żądanie do
  11.      listy RRL (lista RRL zarządza referencjami do zdalnych obiektów po stronie klienta).
  12.   2. Gdy RRL po stronie klienta odbierze żądanie, wywołuje metodę o nazwie invoke () obiektu remoteReference. Wywołanie tej metody      
  13.      przekazuje żądanie do RRL po stronie serwera.
  14.   3. RRL po stronie serwera przekazuje żądanie do Szkieletu (proxy na serwerze), który ostatecznie wywołuje wymaganą metodę obiektu na
  15.      serwerze.
  16.   4. Wynik jest przekazywany z powrotem do klienta.
  17.  
  18. Pakowanie i rozpakowywanie parametrów metod:
  19.     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.
  20.     Po stronie serwera spakowane parametry są rozpakowywane, a następnie wywoływana jest wymagana metoda. Ten proces nazywa się unmarshalling .
  21.  
  22. Rejestr RMI:
  23.     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).
  24.     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 () ).
  25.  
  26. Jak stworzyć aplikację RMI:
  27.     1. Definiujemy zdalny interfejs.
  28.     2. Tworzymy klasę obiektu zdalnego implementującą zdalny interfejs.
  29.     3. Tworzymy program serwera.
  30.     4. Tworzymy program klienta.
  31.  
  32. Interfejs zdalny - zawiera deklarację wszystkich metod określonego obiektu zdalnego. Klient komunikuje się z tym zdalnym interfejsem.
  33.     1. Tworzymy iterfejs, który rozszerza interfejs Remote (należy do pakietu java.rmi).
  34.     2. Deklarujemy wszystkie metody, które klient może wywoływać na obiekcie zdalnym. Gdyż podczas połączenia zdalnych istnieje ryzyko        
  35.        wystąpienia problemów z siecią, może wystąpić wyjątek o nazwie RemoteException - należy go wyrzucić przez metodę  
  36. */
  37.     import java.rmi.Remote;
  38.     import java.rmi.RemoteException;  
  39.  
  40.     public interface Hello extends Remote {  
  41.         void printMsg() throws RemoteException;  
  42.     }
  43.  
  44. /*
  45. Klasa obiektu zdalnego - musi implementować interfejs zdalny utworzony w poprzednim kroku. Jednocześnie definiuje wszystkie metody zadeklarowane w zdalnym interfejsie.  
  46. */
  47.     public class ImplExample implements Hello {  
  48.  
  49.         public void printMsg() {  
  50.             System.out.println("This is an example RMI program");  
  51.         }  
  52.     }
  53.  
  54. /*
  55. 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.
  56.     1. Tworzymy obiekt zdalny.
  57.     2. Eksportujemy zdalny obiekt za pomocą metody exportObject() z klasy UnicastRemoteObject, która należy do pakietu java.rmi.server.
  58.     3. Pobieramy rejestr RMI za pomocą metody getRegistry() z klasy LocateRegistry, która należy do pakietu java.rmi.registry. Metoda    
  59.       getRegistry() zwraca obiekt typu Registry.
  60.     4. Wiążemy zdalny obiekt z pobranym rejestrem za pomocą metody bind(). Jako pierwszy argument metoda przyjmuje nazwę zdalnego        
  61.       obiektu, a jako drugi referencję do zdalnego obiektu.
  62. */
  63. import java.rmi.registry.Registry;
  64. import java.rmi.registry.LocateRegistry;
  65. import java.rmi.RemoteException;
  66. import java.rmi.server.UnicastRemoteObject;
  67.  
  68. public class Server extends ImplExample {
  69.    public Server() {}
  70.    public static void main(String args[]) {
  71.       try {
  72.          // stworzenie obiektu zdalnego
  73.          ImplExample obj = new ImplExample();
  74.    
  75.          // eksportujemy zdalny obiekt
  76.          Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);  
  77.          
  78.          // pobieramy rejestr
  79.          Registry registry = LocateRegistry.getRegistry();
  80.          
  81.          // wiążemy zdalny obiekt
  82.          registry.bind("Hello", stub);
  83.  
  84.          System.err.println("Server ready");
  85.       } catch (Exception e) {
  86.          System.err.println("Server exception: " + e.toString());
  87.          e.printStackTrace();
  88.       }
  89.    }
  90. }
  91.  
  92. /*
  93. Program klienta
  94.     1. Pobieramy rejestr RMI za pomocą metody getRegistry () klasy LocateRegistry, która należy do pakietu java.rmi.registry. Metoda          
  95.       zwraca obiekt typu Registry.
  96.     2. Pobieramy obiekt zdalny z rejestru za pomocą metody lookup(). Do tej metody należy przekazać wartość ciągu reprezentującą nazwę      
  97.       zdalnego obiektu. Spowoduje to zwrócenie referencji do zdalnego obiektu.
  98.     3. Funkcja lookup () zwraca obiekt typu Remote, należy go zrzutować na typ Hello (interfejs zdalny).
  99. */
  100.  
  101. import java.rmi.registry.LocateRegistry;
  102. import java.rmi.registry.Registry;  
  103.  
  104. public class Client {  
  105.    private Client() {}  
  106.    public static void main(String[] args) {  
  107.       try {  
  108.          // pobieramy rejestr
  109.          Registry registry = LocateRegistry.getRegistry(null);
  110.    
  111.          // sprawdzanie rejestru i wyszukiwanie zdalnego obiektu
  112.          Hello stub = (Hello) registry.lookup("Hello");
  113.    
  114.          // wywołanie zdalnej metody
  115.          stub.printMsg();
  116.          
  117.          System.out.println("Remote method invoked");
  118.       } catch (Exception e) {
  119.          System.err.println("Client exception: " + e.toString());
  120.          e.printStackTrace();
  121.       }
  122.    }
  123. }
Add Comment
Please, Sign In to add comment