Avatar billede luctatic Nybegynder
12. maj 2003 - 14:37 Der er 13 kommentarer og
2 løsninger

Interessant timeout exception

Nu kommer der et spørgsmål jeg ikke helt ved hvordan jeg skal forklare, men here goes. Der køres almindeligt RMI over en SSL forbindelse. Hvis jeg prøver at få forbindelse til serveren hvor klienten også er internt på netværket virker det fint. Når man prøver udefra kommer der nogle problemer.

Når man connecter får man fint fat i registry, og får fat i remote-objektet. Men når man prøver at kalde en metode på det, går det galt. Og her kommer så det interessante. Udefra skulle man kun kunne se min eksterne IP, og det er den man prøver at få forbindelse på. Men se lige på fejlmeddelelsen:

java.rmi.ConnectException: Connection refused to host: 192.168.1.10; nested exception is:
java.net.ConnectException: Connection timed out: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:567)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185
)
...osv


På fejlen ses min interne IP lige pludseligt. Min ide kommer her: Klienten connecter til server, og finder remote objektet i registry. Dette objekt siger at nu skal klienten lave en SSL forbindelse, og objektet fortæller at den skal lave denne forbindelse til den eneste IP objektet kender, nemlig der hvor den ligger, min interne IP. Når klienten nu prøver at oprette en forbindelse til min interne IP går det selvfølgeligt galt da han ikke kan bruge den over nettet.

Er det et muligt scenarie, og hvis det er - hvad kan man gøre ved det?
Avatar billede arne_v Ekspert
12. maj 2003 - 14:44 #1
Har du overvejet at skifte fra RMI til Web Service ?

HTTPS er nok lidt nemmere at få igennem client->firewall->server !
Avatar billede arne_v Ekspert
12. maj 2003 - 14:44 #2
Og jeg tror at din analyser er rigtig - og jeg har ingen anelse
om hvordan man løser det.
Avatar billede luctatic Nybegynder
12. maj 2003 - 14:45 #3
RMI er bare så lækkert da det ordner mange behind-the-scenes ting som man ikke behøver bruge tid på.
Avatar billede arne_v Ekspert
12. maj 2003 - 15:02 #4
Du får fuldstændigt samme funktionalitet far en Web Service.

Du har din server kode, og så genererer du noget serve-side
skeleton og noget client-side stub, og så kan client kalde
serveren med et standard method call.

Fuldstændigt ligesom RMI.

Der er kun 2 forskelle:

1)  Formatet er ikke Java serialised object men XML, hvilket gør at
    det ike kun er Java-Java men også .NET-Java og alle mulige andre
    platforms kombinationer.

2)  Transport er ikke JRMP/IIOP men HTTP/HTTPS hvilket gør at man har
    meget nemmere ved at komme igennem firewalls.
Avatar billede luctatic Nybegynder
12. maj 2003 - 15:12 #5
Skal ærligt indrømme at jeg ikke har overvejet det da jeg ikke kender brugen af det. Kunne være man skulle sætte sig ned og lære noget om det. Bare lidt for sent at ændre det hele fra RMI til web services tror jeg.
Avatar billede arne_v Ekspert
12. maj 2003 - 15:20 #6
Prøv og kig i user guiden på http://ws.apache.org/axis/ (husk og bladre
ned til "building stubs").
Avatar billede arne_v Ekspert
12. maj 2003 - 15:22 #7
Men ja - hvis projektet er godt igang så er et arkitektur skift nok
ikke sagen.

Men måske er der andre som har erfaringer med RMI igennem firewalls
og kan hjælpe.
Avatar billede luctatic Nybegynder
12. maj 2003 - 16:18 #8
Tyder på at man kan bruge "-Djava.rmi.server.hostname=www.minhost.com" og på denne måde tvinge den til at bruge den eksterne ip, men det resulterer bare i en connection refused:

java.rmi.ConnectException: Connection refused to host: www.minhost.com; nested exception is:
        java.net.ConnectException: Connection timed out: connect
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:567)
        at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185)
        at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:101)
...osv
Avatar billede arne_v Ekspert
12. maj 2003 - 16:24 #9
Jo - men er firewallen åben på den port som RMI client forsøger at connecte
på ?
Avatar billede arne_v Ekspert
12. maj 2003 - 16:25 #10
(altså ikke client->RMIregistry som er port 1099 default, men den
port som client->connecter på til server)

Hvis ikke så skal man have tunneled gennem HTTP mener jeg at have læst
noget om engang.
Avatar billede luctatic Nybegynder
12. maj 2003 - 16:39 #11
Ja - registry er sat op til port 6500, og routeren er åben for både tcp og udp på denne port. Man får jo også fat i registry udefra og får fat i remoteobjektet. Får bare et problem når der prøves at kalde en metode på objektet. Tyder på den stadig ændrer noget et eller andet sted, selvom IP'en nu lader til at være konstant. Kan jo være det er porten den nu retter i selvom jeg har sat registry til at køre på en specifik port.
Avatar billede arne_v Ekspert
12. maj 2003 - 16:56 #12
En RMI client åbner connection til både RMIregistry og din RMI server.

Det første er default 1099 men altså 6500 i dit tilfælde.

Men hvad med det andet ?
Avatar billede luctatic Nybegynder
12. maj 2003 - 17:09 #13
Fik fastlåst IP'en på serveren via hardcoding (skal kalde super(serverport, ServerSocketFactory(), ClientSocketFactory() i starten af Remote-objektets konstruktør), og problemet viste sig ligge meget tæt på dette problem.

Før da serveren kørte internt kunne porten jo være lige gyldig, og som stardard står der et nul, hvilket betyder at OS kan vælge porten. Nu satte jeg så porten til en specifik port, og dermed fastlagde jeg hvilke SocketFactories der skulle benyttes for at få forbindelse. Disse SocketFactories skulle laves og sættes inde i kontruktøren istedet for at benytte nogen der kom som konstruktørparametre.

Lyder indviklet, men nu virker det i hvert fald. Du får et par point igen hvis du smider et svar fordi du gider høre på mit vrøvl når jeg først kommer igang med det her gylle :D
Avatar billede arne_v Ekspert
12. maj 2003 - 17:14 #14
svar
Avatar billede luctatic Nybegynder
12. maj 2003 - 17:20 #15
Vi deles lidt denne gang - vil have lidt credit for at løse det her som på ingen måde er logisk. Hvis ingen andre vil rose mig så kan man da altid gøre det selv =)
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