RMI

0

witam

na podstawie przykladowej aplikacji zawartej w ksiazce Java2: Techniki zaawansowane chcialem wyprobowac dzialanie RMI.
Lokalnie aplikacja dziala bez zarzutow niestety przy probie polaczenia z innym komputerem nie chce zaskoczyc.
Zrobilem wszystko krok po kroku jak jest napisane w ksiazce tzn przenioslem odpowiednie pliki na komputer clienta, utworzylem katalog downloads na komputerze serwera i przenioslem tam plik namiastki oraz interfejs. Uruchomilem program rmiregistry nastepnie aplikacje serwera ktora wystartowala bez problemow. Natomiast po uruchomeniu aplikacji clienta jakies 5 sekund od uruchomienia dostaje komunikat o bledzie:java.rmi.UnmarchalException i nie wiem co sie dzieje.

Przy pomocy "System.out.println("do tej pory chodzi")" :-) zauwazylem, ze program wykonuje sie do napotkania Product c1 = (Product)Naming.lookup(url+"p1"); czyli tak jak by nie znajdywal zapisu w rmiregistry?

0

Sa jakies firewalle po drodze? rmiregistry uzywa domyslnie 1099, a to jest raczej jeden z takich ktore standardowo nie sa puszczane.

0

komputery sa polaczone za pomoca huba - jeden kablem drugi za pomoca wifi. zadne firewalle nie sa wlaczone.

0

Najlepoej jakbys pokazac pelnego stack trace wyjatku ktory dostajesz.

0
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
        java.lang.ClassNotFoundException: ProductImpl_Stub
        at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
        at java.rmi.Naming.lookup(Unknown Source)
        at ProductClient.main(ProductClient.java:15)
Caused by: java.lang.ClassNotFoundException: ProductImpl_Stub
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
        at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
        at java.rmi.server.RMIClassLoader$2.loadClass(Unknown Source)
        at java.rmi.server.RMIClassLoader.loadClass(Unknown Source)
        at sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source)
        at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
        at java.io.ObjectInputStream.readClassDesc(Unknown Source)
        at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
        at java.io.ObjectInputStream.readObject0(Unknown Source)
        at java.io.ObjectInputStream.readObject(Unknown Source)
        ... 3 more
0

A czy klasy są Serializable?

Uwaga ogólna. Warto do takich eksperymentów zainstalować sobie Sun VirtualBox. Jest to opensourcowa maszyna wirtualna (nie mylić z JVM!!!). Tworzysz sobie lokalni wirtualny komputer i komunikacja jest w ramach jednej maszyny fizycznej. Nie ma firewalli itp.

0

Stack trace wskazuje ze nie moze byc zaladowana klasa ProductImpl_Stub, ktora powinna znajdowac sie na serwerze, i powinna byc sciagnieta na klienta poprzez lookup w rmiregistry. Jak czytales tutorial suna, lub Core Java 2, to jest tam wzmianka ze jak startujesz rmiregistry, to CLASSPATH nie moze byc ustawione, co wiecej, aktualny katalog nie moze zawierac definicji klas. Moze to jest problemem?

0

http://java.sun.com/j2se/1.5.0/docs/guide/rmi/codebase.html
punkt 6.2 jest idealnie Twoim problemem, jest podane rozwiazanie

0

classpath nie jest ustawione natomiast problem moze byc wlasnie w uruchamianiu rmiregistry kiedy w biezacym katalogu znajduja sie pliki klas. Uruchomilem teraz rmiregistry bedac w katalogu gdzie nie znajduja sie zadne pliki klas. Nastepnie uruchomilme aplikacje serwera, ktora wiesza sie przy wykonywaniu Naming.rebind("p1", p1);
Naming.rebind("p2", p2);

0

ok juz dziala. Problemem byl rzeczywiscie codebase, tyle ze wczesniej wprowadzalem go poprawnie a potem zaczalem kombinowac bo wydawalo mi sie, ze program clienta sie wiesza. Teraz widze, ze potrzebuje on po prostu pare sekund na pobranie informacji z serwera i wyswietlenia ich ;-)

Dzieki za pomoc [browar]

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