Avatar billede simonvalter Praktikant
17. februar 2004 - 06:25 Der er 7 kommentarer og
1 løsning

RMI på anden host end localhost

Jeg har rodet med rmi før men kun hvor client og server er på samme host.
Nu har jeg prøvet at flytte server delen til min freebsd server, og der kan jeg ikke engang få det til at starte.

jeg bruger arne_v's eksempel i hans artikel dog hvor jeg kun laver stub.

# pwd
/usr/home/loadet

javac rmitest/*.java

rmic rmitest.CalcImpl -v1.2

# ls rmitest/
Calc.class              Calc.java              CalcImpl.class          CalcImpl.java          CalcImpl_Stub.class

rmi registry kører

java -cp . rmitest.CalcImpl

det resulterer så i

java.rmi.ConnectIOException: Exception creating connection to: 62.242.117.41; nested exception is:
        java.net.SocketException: Connection reset by peer


jeg mener jeg læste at den default bruger localhost hvis man ikke sætter den til at bind til en fast ip
og min /etc/hosts
er fin 127.0.0.1              localhost.gbit.dk localhost

så hvor min eksterne ip kommer ind kan jeg ikke se.
maskinens hostname er godt nok gbit.dk som resolver til 62.242.117.41



hvis jeg så prøver at bind til en anden ip så går det helt galt
Naming.rebind("//127.0.0.1/Calc", new CalcImpl());
(hvad jeg har læst skulle det ikke være nødvendigt at sætte en protocol), men jeg har da også prøvet med rmi:// og prøvet at angive den default port 1099 og prøvet et andet hostname der resolver til min interne ip 192.168.1.2


java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
        java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
        java.lang.ClassNotFoundException: rmitest.CalcImpl_Stub
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
        java.lang.ClassNotFoundException: rmitest.CalcImpl_Stub
java.lang.ClassNotFoundException: rmitest.CalcImpl_Stub
        at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:245)
        at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:220)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:354)
        at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
        at java.rmi.Naming.rebind(Naming.java:160)
        at rmitest.CalcImpl.main(CalcImpl.java:34)


for at få serveren til at køre i jbuilder var jeg nødt til at bruge
java -Djava.rmi.server.codebase=file:c:\path\til\classes

så det har jeg også prøvet i commandline
java -Djava.rmi.server.codebase=/home/loadet/rmitest/ rmitest.CalcImpl
og 100 andre varianter...

der er ingen firewall der laver problemer, ihvertfald ikke i serveren jeg er godt nok bag nat, men det burde ikke betyde noget internt.
jeg vil have at min client på 192.168.1.6 kan connecte til serveren 192.168.1.2.

jeg vil blive meget glad hvis der er nogen der kan opklare dette problem :)
Avatar billede simonvalter Praktikant
17. februar 2004 - 06:27 #1
jeg vender tilbage senere idag da jeg er på vej i skole snart.
Avatar billede simonvalter Praktikant
17. februar 2004 - 06:40 #2
jeg har iøvrigt sat
rmiregistry -J-classpath -J/home/loadet/rmitest
hvilket skulle gøre at stub klassen er i classpath for rmiregistry, hvis jeg har forstået det rigtigt.
Avatar billede arne_v Ekspert
17. februar 2004 - 09:48 #3
Du:

1)  laver en klasse som extender RMISocketFactory og bruger port Y
2)  den sætter du med RMISocketFactory.setSocketFactory i din server
3)  du creater registry på port X
4)  du åbner port X og Y i din firewall/router
5)  du starter din server med -Djava.rmi.server.hostname=din-eksterne-ip

Det har jeg haft til at virke !
Avatar billede arne_v Ekspert
17. februar 2004 - 09:51 #4
Hm - jeg har vist misforstået spørgsmålet - det er bare fra en maskine til en anden
maskine og begge er bag firewall/router.
Avatar billede arne_v Ekspert
17. februar 2004 - 09:56 #5
Det lyder mere som om dit problem er classpath til stubben.

Dokumentationen tilråder at stubben ikke er i classpath til RMIregistry
og at man bruger f.eks. -Djava.rmi.server.codebase=http://server/dir/.

Pointen er nemlig at RMIregistry beder client lede efter stub samme sted
som den selv har fundet den.

Det er imidlertid efter min bedste mening at gå over åen efter vand. Hvis
man eksplicit putter stub i classpath for både RMIregistry og client, så
virker det OK.
Avatar billede simonvalter Praktikant
17. februar 2004 - 16:00 #6
så virker det!
http:// kan jeg stadig ikke bruge, men -Djava.rmi.server.hostname= var en hjælp da det tager ca 2 min længere at starte serveren uden..
løsningen blev:
java -Djava.rmi.server.codebase=file:/home/loadet/ -Djava.rmi.server.hostname=192.168.1.2 rmitest.CalcImpl

af en eller anden grund sad jeg i nat og satte min codebase,classpath til /home/loadet/rmitest .. og rmitest er jo min package..


men tak for hjælpen :)
Avatar billede arne_v Ekspert
17. februar 2004 - 16:08 #7
http:// kræver naturligvis at .class/.jar ligger på en web server.

[da RMI blev designet troede man stadig at applets havde en stor fremtid foran sig]
Avatar billede simonvalter Praktikant
17. februar 2004 - 16:10 #8
ok :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester