Wszystko o rejestrze Java RMI i sposobie korzystania z niego

  • Brian Curtis
  • 0
  • 2138
  • 417
Reklama

RMI oznacza zdalne wywoływanie metody i, jak sama nazwa wskazuje, jest protokołem dla programu Java do wywołania metody obiektu działającego na innym komputerze. Zapewnia interfejs API Czym są interfejsy API i jak otwarte interfejsy API zmieniają Internet Czym są interfejsy API i jak otwarte interfejsy API zmieniają Internet Czy zastanawiałeś się kiedyś, jak programy na komputerze i odwiedzane strony internetowe „rozmawiają” ze sobą? (Application Programming Interface) do eksportowania obiektu z jednego programu (zwanego serwerem) i wywoływania metod tego obiektu z innego programu (zwanego klientem), prawdopodobnie działającego na innym komputerze.

Java Rejestr RMI jest kluczowym elementem systemu Java RMI i zapewnia scentralizowany katalog dla serwerów do rejestrowania usług i dla klientów do wyszukiwania tych usług. W tym artykule dowiadujemy się, jak zaimplementować serwer, aby udostępnić obiekt, a klient wywołać metodę na serwerze, a także zarejestrować i wyszukać usługę w rejestrze RMI.

Deklarowanie interfejsu serwera

Aby poznać zawiłości działania systemu Java RMI, zaimplementujmy prosty obiekt serwera zapewniający metodę akceptowania nazwy i zwracania pozdrowienia. Oto definicja interfejsu obiektu:

import java.rmi.Remote; import java.rmi.RemoteException; Interfejs publiczny Powitanie rozszerza Zdalne publiczne powitanie ciągu (nazwa ciągu) zgłasza RemoteException;  

Nazwa interfejsu nazywa się Powitanie. Zapewnia jedną metodę o nazwie powitać() która przyjmuje nazwę i zwraca odpowiednie powitanie.

Aby oznaczyć ten interfejs jako eksportowalny, należy go rozszerzyć java.rmi.Remote berło. Również metoda musi zadeklarować a rzuca lista klauzul java.rmi.RemoteException oprócz wyjątków specyficznych dla aplikacji Wyjątki Javy: czy sobie z nimi radzisz? Wyjątki Java: czy sobie z nimi radzisz? Wyjątek w programowaniu oznacza wyjątkowy warunek w wykonywaniu programu. Jest używany, gdy warunek można lepiej rozwiązać w innym miejscu. Rozważ następujące przykłady obsługi wyjątków Java. . Dzieje się tak, aby kod klienta mógł obsługiwać (lub propagować) błędy wywoływania metod zdalnych, takie jak Host nieznaleziony, błąd połączenia, itp.

Implementowanie obiektu serwera

Po zadeklarowaniu interfejsu (używanego przez klientów) implementujemy obiekt po stronie serwera i udostępniamy powitać() metoda jak pokazano. Używa prostego ciągu formatującego do sformatowania powitania.

klasa publiczna GreetingObject implementuje Greeting private String fmtString = "Hello,% s"; public String greet (String name) return String.format (this.fmtString, name);  

Główna metoda serwera

Zbierzmy teraz wszystkie te elementy razem i zaimplementuj Główny() metoda serwera. Przejdźmy przez każdy z odpowiednich kroków.

  • Pierwszym krokiem jest utworzenie implementacji obiektu serwera.
    Powitanie powitanie = new GreetingObject (); 
  • Następnie otrzymujemy kod pośredniczący dla obiektu serwera z środowiska wykonawczego RMI. Kod pośredniczący implementuje ten sam interfejs co obiekt serwera. Jednak metoda implementuje wymaganą komunikację ze zdalnym obiektem serwera. Ten kod pośredniczący jest używany przez klienta do przezroczystego wywołania metody na obiekcie serwera.
    Powitanie stub = (Powitanie) UnicastRemoteObject.exportObject (powitanie, 0); 
  • Po uzyskaniu kodu pośredniczącego przekazujemy go do rejestru RMI w celu powiązania z określoną usługą nazwaną. Gdy klient żąda implementacji tej usługi, otrzymuje kod pośredniczący, który wie, jak komunikować się z obiektem serwera. Poniżej metoda statyczna LocateRegistry.getRegistry () służy do uzyskania odniesienia do rejestru lokalnego. The rebind () Metoda jest następnie używana do powiązania nazwy z kodem pośredniczącym.
    Nazwa ciągu = „Powitanie”; Rejestr rejestru = LocateRegistry.getRegistry (port); register.rebind (nazwa, skrót); 

Kompletna główna metoda.

import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; public class Main static public void main (String [] args) zgłasza wyjątek if (args.length == 0) System.err.println ("use: java Main port #"); System.exit (1);  int index = 0; int port = Integer.parseInt (args [indeks ++]); Nazwa ciągu = „Powitanie”; Powitanie powitanie = new GreetingObject (); Powitanie stub = (Powitanie) UnicastRemoteObject.exportObject (powitanie, 0); Rejestr rejestru = LocateRegistry.getRegistry (port); register.rebind (nazwa, skrót); System.out.println („Powitanie związane z \” ”+ nazwa +„ \ ””);  

Budowanie serwera

Przyjrzyjmy się teraz budowie serwera. Dla uproszczenia budujemy za pomocą wiersza poleceń w systemie Linux, a nie za pomocą narzędzia do budowania, takiego jak Maven.

Poniżej kompiluje pliki źródłowe do plików klas w katalogu docelowym.

rm -rf target mkdir target javac -d target src / server / *. java 

Zbierz pliki klas do pliku JAR w celu wykonania.

jar cvf target / rmi-server.jar -C serwer docelowy 

Gromadzimy również pliki interfejsu wymagane do skompilowania klienta w bibliotece JAR.

jar cvf target / rmi-lib.jar -C serwer docelowy / Greeting.class 

Wdrożenie klienta

Przyjrzyjmy się teraz implementacji klienta używanego do wywoływania metod obiektów serwerowych.

  • Podobnie jak w przypadku serwera, uzyskaj odwołanie do rejestru, podając nazwę hosta, w którym rejestr jest uruchomiony, oraz numer portu.
    Rejestr rejestru = LocateRegistry.getRegistry (host, port); 
  • Następnie wyszukaj usługę w rejestrze. The lookup () Metoda zwraca kod pośredniczący, którego można użyć do wywołania usług.
    Powitanie powitanie = (Powitanie) register.lookup (name); 
  • I wywołaj metodę przekazując wymagane argumenty. Tutaj otrzymujemy powitanie, przekazując nazwę i drukując ją.
    System.out.println (nazwa + „zgłoszony:” + powitanie.greet (mojaNazwa)); 

Pełny kod klienta:

klient pakietu; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; importuj serwer. Powitanie; public class Client static public void main (String [] args) zgłasza wyjątek if (args.length! = 3) System.err.println ("wykorzystanie: port hosta klienta java mojaNazwa"); System.exit (1);  int index = 0; Ciąg host = argumenty [indeks ++]; int port = Integer.parseInt (args [indeks ++]); Ciąg myName = args [index ++]; Nazwa ciągu = „Powitanie”; Rejestr rejestru = LocateRegistry.getRegistry (host, port); Powitanie powitanie = (Powitanie) register.lookup (name); System.out.println (nazwa + „zgłoszony:” + powitanie.greet (mojaNazwa));  

Rejestr RMI

Uruchommy teraz program serwera, aby mógł zacząć obsługiwać żądania.

java -cp target / rmi-server.jar server.Main 1099 # zgłasza wyjątek w wątku „main” java.rmi.ConnectException: Odmowa połączenia z hostem: xxx; wyjątek zagnieżdżony to: java.net.ConnectException: połączenie odrzucone 

Co to za wyjątek Jak prawidłowo obsługiwać wyjątki Java Jak prawidłowo obsługiwać wyjątki Java W tym artykule dowiesz się, jakie są wyjątki Java, dlaczego są one ważne, jak z nich korzystać oraz jakie są typowe błędy, których należy unikać. ? Połączenie odrzucone.

Przyczyną tego wyjątku jest to, że: zanotuj z kodu serwera, że ​​próbuje połączyć się z rejestrem lokalnym na porcie 1099. Jeśli to się nie powiedzie, skończysz z tym wyjątkiem.

Rozwiązaniem jest uruchomienie rejestru RMI. Rejestr RMI to program dostarczany z wirtualną maszyną Java i jest nazywany rmiregistry. Powinien znajdować się w kosz katalog instalacji wirtualnej maszyny Java. Uruchomienie jest tak proste, jak:

/usr/lib/jvm/jdk1.8.0_71/bin/rmiregistry 

Domyślnie rejestr nasłuchuje na porcie 1099. Aby umożliwić nasłuchiwanie na innym porcie, określ numer portu w następujący sposób:

/usr/lib/jvm/jdk1.8.0_71/bin/rmiregistry 1100 

Sprawdź, czy rzeczywiście na danym porcie znajduje się słuchacz za pomocą polecenia netstat. 8 poleceń CMD do zarządzania sieciami (bezprzewodowymi) w systemie Windows 8 Polecenia CMD do zarządzania sieciami (bezprzewodowymi) w systemie Windows Jeśli chcesz uzyskać pełną i absolutną kontrolę nad siecią, Będę musiał zacząć korzystać z wiersza polecenia. Oto najbardziej przydatne polecenia do zarządzania siecią domową i rozwiązywania problemów. :

netstat -an -t tcp -p | grep LISTEN… tcp6 0 0 ::: 1100 ::: * LISTEN 23450 / rmiregistry 

Uruchamianie serwera

Spróbujmy teraz ponownie uruchomić serwer.

java -cp target / rmi-server.jar server.Main 1100 # rzuca java.rmi.UnmarshalException: błąd podczas usuwania argumentów… Przyczyna: java.lang.ClassNotFoundException: server.Greeting… 

Znowu wyjątek! Co to jest tym razem??

Serwer nie może załadować klasy interfejsu server.Greeting. Dzieje się tak, ponieważ rejestr RMI nie może załadować wymaganej klasy. Musisz więc określić lokalizację wymaganych klas. Jednym ze sposobów jest określenie zmiennej środowiskowej CLASSPATH:

CLASSPATH =… /… /junk/target/rmi-lib.jar /usr/lib/jvm/jdk1.8.0_71/bin/rmiregistry 1100 

Ponowna próba uruchomienia serwera daje:

java -cp target / rmi-server.jar server.Main 1100 # print Powitanie powiązane z „Powitanie” 

Teraz serwer działa.

Uruchamianie klienta

Po złożeniu i uruchomieniu wszystkich części uruchomienie klienta jest proste. Do wykonania potrzebuje odpowiednich plików JAR. Należą do nich klasa zawierająca Główny() metoda i klasa interfejsu. Akceptuje argumenty wskazujące, gdzie jest uruchomiony rejestr RMI oraz nazwę powitania.

java -cp target / rmi-client.jar: target / rmi-lib.jar client.Client localhost 1100 Peter # print Powitanie zgłoszone: Witaj Peter 

streszczenie

Java RMI zapewnia interfejs API i narzędzia ułatwiające zdalne wykonanie kodu. Można zaimplementować serwer, który rejestruje obiekt usługi w rejestrze Java RMI. Klienci mogą wyszukiwać informacje w rejestrze i uzyskiwać kod pośredniczący obiektu usługi w celu wywołania metod usługi. Jak pokazuje ten przykład, wszystko jest dość proste.

Czy używasz Java RMI w swoim projekcie? Jakie było twoje doświadczenie? Czy są jakieś alternatywy, które badałeś? Daj nam znać w komentarzach poniżej.




Jeszcze bez komentarzy

O nowoczesnej technologii, prostej i niedrogiej.
Twój przewodnik w świecie nowoczesnych technologii. Dowiedz się, jak korzystać z technologii i gadżetów, które nas otaczają każdego dnia i dowiedz się, jak odkrywać ciekawe rzeczy w Internecie.