Notatka:
pakiet java.rmi : Zdalne wywoływanie metod (RMI) zostało wycofane w wersji Java 9 i nowszych wersjach na rzecz innych mechanizmów komunikacji zdalnej, takich jak usługi sieciowe lub zdalne wywołania procedur (RPC).
Zdalne wywoływanie metod (RMI) to interfejs API umożliwiający obiektowi wywołanie metody na obiekcie istniejącym w innej przestrzeni adresowej, który może znajdować się na tym samym komputerze lub na komputerze zdalnym. Dzięki RMI obiekt działający w maszynie JVM znajdującej się na komputerze (po stronie klienta) może wywoływać metody na obiekcie znajdującym się w innej maszynie JVM (po stronie serwera). RMI tworzy publiczny obiekt zdalnego serwera, który umożliwia komunikację po stronie klienta i serwera poprzez proste wywołania metod na obiekcie serwera.
Obiekt pośredni: Obiekt pośredniczący na komputerze klienckim tworzy blok informacyjny i wysyła te informacje do serwera.
Blok składa się z
- Identyfikator obiektu zdalnego, który ma zostać użyty
- Nazwa metody, która ma zostać wywołana
- Parametry zdalnej maszyny JVM
Obiekt szkieletowy: Obiekt szkieletowy przekazuje żądanie z obiektu pośredniczącego do obiektu zdalnego. Wykonuje następujące zadania
- Wywołuje żądaną metodę na rzeczywistym obiekcie znajdującym się na serwerze.
- Przekazuje parametry otrzymane z obiektu pośredniczącego do metody.
Działanie RMI
Komunikacja pomiędzy klientem a serwerem odbywa się za pomocą dwóch obiektów pośrednich: obiektu Stub (po stronie klienta) i obiektu Skeleton (po stronie serwera), co można również przedstawić na poniższym nośniku w następujący sposób:
Oto kroki, które należy wykonać sekwencyjnie, aby zaimplementować interfejs zdefiniowany poniżej w następujący sposób:
typy komputerów
- Definiowanie zdalnego interfejsu
- Implementacja zdalnego interfejsu
- Tworzenie obiektów Stub i Skeleton z klasy implementacyjnej przy użyciu rmic (kompilator RMI)
- Uruchom rejestr rmi
- Utwórz i wykonaj program aplikacji serwera
- Utwórz i wykonaj program aplikacji klienckiej.
Krok 1: Zdefiniowanie zdalnego interfejsu
Pierwszą rzeczą do zrobienia jest utworzenie interfejsu, który będzie zawierał opis metod, które mogą być wywoływane przez zdalnych klientów. Ten interfejs powinien rozszerzać interfejs zdalny, a prototyp metody w interfejsie powinien generować wyjątek RemoteException.
Przykład:
Jawa
// Creating a Search interface> import> java.rmi.*;> public> interface> Search> extends> Remote> {> > // Declaring the method prototype> > public> String query(String search)> throws> RemoteException;> }> |
>
>
Krok 2: Implementacja zdalnego interfejsu
Następnym krokiem jest wdrożenie zdalnego interfejsu. Aby zaimplementować zdalny interfejs, klasa powinna rozszerzyć się na klasę UnicastRemoteObject pakietu java.rmi. Ponadto należy utworzyć domyślny konstruktor, aby zgłosić wyjątek java.rmi.RemoteException z jego konstruktora nadrzędnego w klasie.
Jawa
// Java program to implement the Search interface> import> java.rmi.*;> import> java.rmi.server.*;> public> class> SearchQuery> extends> UnicastRemoteObject> > implements> Search> {> > // Default constructor to throw RemoteException> > // from its parent constructor> > SearchQuery()> throws> RemoteException> > {> > super> ();> > }> > // Implementation of the query interface> > public> String query(String search)> > throws> RemoteException> > {> > String result;> > if> (search.equals(> 'Reflection in Java'> ))> > result => 'Found'> ;> > else> > result => 'Not Found'> ;> > return> result;> > }> }> |
>
podkreślenie przeceny
>
Krok 3: Tworzenie obiektów Stub i Skeleton z klasy implementacyjnej przy użyciu rmic
Narzędzie rmic służy do wywoływania kompilatora rmi, który tworzy obiekty Stub i Skeleton. Jego prototypem jest nazwa klasy rmic. W przypadku powyższego programu należy wykonać następujące polecenie w wierszu poleceń
rmic zapytanie wyszukiwania.
Krok 4: Uruchom rejestr rmi
Uruchom usługę rejestru, wydając następujące polecenie w wierszu poleceń start rmiregistry
Krok 5: Utwórz i uruchom program aplikacji serwera
Następnym krokiem jest utworzenie programu aplikacji serwera i wykonanie go w osobnym wierszu poleceń.
- Program serwera używa metody createRegistry klasy LocateRegistry do utworzenia rejestru rmiregistry w maszynie JVM serwera z numerem portu przekazanym jako argument.
- Metoda rebind klasy Naming służy do powiązania zdalnego obiektu z nową nazwą.
Jawa
// Java program for server application> import> java.rmi.*;> import> java.rmi.registry.*;> public> class> SearchServer> {> > public> static> void> main(String args[])> > {> > try> > {> > // Create an object of the interface> > // implementation class> > Search obj => new> SearchQuery();> > // rmiregistry within the server JVM with> > // port number 1900> > LocateRegistry.createRegistry(> 1900> );> > // Binds the remote object by the name> > // geeksforgeeks> > Naming.rebind(> ' rmi://localhost:1900 '> +> > '/geeksforgeeks'> ,obj);> > }> > catch> (Exception ae)> > {> > System.out.println(ae);> > }> > }> }> |
>
>
Krok 6: Utwórz i uruchom program aplikacji klienckiej
Ostatnim krokiem jest utworzenie programu aplikacji klienckiej i wykonanie go w osobnym wierszu poleceń. Metoda wyszukiwania klasy Naming służy do uzyskania referencji do obiektu Stub.
Jawa
// Java program for client application> import> java.rmi.*;> public> class> ClientRequest> {> > public> static> void> main(String args[])> > {> > String answer,value=> 'Reflection in Java'> ;> > try> > {> > // lookup method to find reference of remote object> > Search access => > (Search)Naming.lookup(> ' rmi://localhost:1900 '> +> > '/geeksforgeeks'> );> > answer = access.query(value);> > System.out.println(> 'Article on '> + value +> > ' '> + answer+> ' at techcodeview.com'> );> > }> > catch> (Exception ae)> > {> > System.out.println(ae);> > }> > }> }> |
>
>
Notatka: Powyższy program klienta i serwera jest wykonywany na tej samej maszynie, więc używany jest localhost. Aby uzyskać dostęp do zdalnego obiektu z innego komputera, należy zastąpić localhost adresem IP, pod którym znajduje się zdalny obiekt.
zapisz pliki odpowiednio zgodnie z nazwą klasy jako
Search.java, SearchQuery.java, SearchServer.java i ClientRequest.java
Ważne obserwacje:
- RMI to rozwiązanie oparte wyłącznie na języku Java do zdalnych wywołań procedur (RPC) i służy do tworzenia aplikacji rozproszonych w języku Java.
- Obiekty Stub i Skeleton służą do komunikacji pomiędzy klientem a serwerem.