Java RMI - problem z uruchomieniem aplikacji

0

W Netbeans stworzyłem dwa oddzielne projekty: dla klienta i serwera. Projekt klienta zawiera klasę klienta oraz interfejs dziedziczący po Remote z deklaracją metody uruchamianej zdalnie, projekt serwera zawiera ten sam interfejs, klasę implementująca interfejs zawierającą definicję tej metody oraz oczywiście klasę serwera. Metoda wywoływana zdalnie jest bardzo prosta , drukuje tylko napis.

Kluczowe fragmenty kodu wyglądają tak:

Klasa klienta:

 
Registry reg = LocateRegistry.getRegistry("localhost");
rmiInterface stub = (rmiInterface) reg.lookup("Hello");
stub.hello(msg);

Klasa serwera:

 
rmiImpl robj = new rmiImpl();
rmiInterface stub = (rmiInterface) UnicastRemoteObject.exportObject(robj, 0);
Registry reg = LocateRegistry.createRegistry(1099);
registry.rebind("Hello", stub);
System.out.println("Server is ready to listen: ");

Najpierw uruchamiam serwer, potem uruchomienie klienta zwraca następujące błędy:

Client exception thrown: java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: rmi_server.rmiInterface (no security manager: RMI class loader disabled)
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: rmi_server.rmiInterface (no security manager: RMI class loader disabled)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at rmi_client.MyClient.main(MyClient.java:28)
Caused by: java.lang.ClassNotFoundException: rmi_server.rmiInterface (no security manager: RMI class loader disabled)
at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:554)
at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:646)
at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:311)
at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:257)
at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1549)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1511)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
... 2 more

Jak rozwiązać powyższy problem ? Z góry dzięki za pomoc.

0
  1. Jesteś pewien że zarówno klient jak i serwer mają dostęp do wszystkich klas których potrzebują?
  2. Treść błędu jest taka, jakbyś w tej metodzie Hello miał użytą jakąś klasę pochodną (jako argument albo jako wartość zwracaną) i rmi próbowało dociągnąć źródła (ma taką opcję) ale nie moze bo security manager nie pozwala.
    Gdzieś w kodzie niewątpliwie masz błąd ;] Jesteś pewien że np interfejs remote jest poprawny? Metody rzucają RemoteException?
0

Ok, błąd był spowodowany tym, że dwa razy stworzyłem interfejs rmiInterface w projekcie klienta i serwera. Taki wspólny interfejs powinien zawierać się w zasobach współdzielonych przez obydwa projekty, więc zrobiłem paczkę RMI_Shared.jar zawierającą interfejs i dołączyłem do projektów. Teraz aplikacja działa, tzn uruchomienie klienta kiedy serwer oczekuje nie zwraca wyjątków, ale wiadomość która powinna się wydrukować w konsoli klienta drukuje się w konsoli serwera.

0

A skąd pomysł że powinna się wypisać u klienta?! Metoda zdalna jest wykonywana po stronie gdzie został stworzony obiekt zdalny!
Jak chcesz coś dostać w kliencie to musisz z tej metody zwrócić sobie jakis wynik i go wypisać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1