I et Java program har jeg en RMI server kørende, som det er meningen at man kan kalde op fra Internettet. Men jeg kan ikke få konfigureret min router til at åbne op for serverens port.
I programmet har jeg sat serveren til at lytte på port 8090 men kan altså ikke åbne denne port for Internet-kommunikation.
Min router er en Cisco 677 med direkte forbindelse til pc'en (jeg har intet LAN). Mit OS er Win XP Pro.
Jeg har - uden held - prøvet følgende kommando til routeren for at åbne porten (via Hyperterminal):
"set nat entry add 192.168.1.4 8090 <min eksterne IP her> 8090 tcp"
Addressen 192.168.1.4 er min localhost (pc'ens interne IP). Nogen forslag?
Jeg tror ikke det er problemet, for programmet (dvs. serveren) har kunne køre hos en kammerat, og jeg har været i stand til at kalde serveren der kører hos ham (hans forbindelse er med ADSL-modem og ikke router).
Jeg havde opfattelse af at det var nok at give RMIregistry en port, og registrere sin(e) server(e) der vha. et navn (Naming). Så kan en klient kalde "lookup" på den IP hvor rmiregistry findes + et navn for det objekt (dvs. serveren) som skal kaldes op. Men RMIregistry tildeler måske mit server-objekt en port at lytte på bag kulissen?
Her er koden der bruges til at oprette enten en klient eller en server (serveren oprettes i "else" statementet). Koden er fra en GUI hvor brugeren bestemmer om han vil være klient eller server:
try { JButton source = (JButton)e.getSource(); if (source.getText().equals("Log på")) { //Der forsøges at logge på serveren her, og venter så. SpeedCarRemoteImpl remoteplayer = new SpeedCarRemoteImpl(navn.getText()); SpeedCarServer scs = (SpeedCarServer)Naming.lookup("rmi://"+ip.getText()+":8090/speedcar"); remoteplayer.setServerObj(scs); scs.tilfoejSpiller(remoteplayer); this.dispose(); } else if (source.getText().equals("Jeg initierer spillet")) { //Serveren oprettes her hvis denne knap er valgt SpeedCarServerImpl scs = new SpeedCarServerImpl(navn.getText()); java.rmi.registry.LocateRegistry.createRegistry(8090); Naming.rebind("//localhost:8090/speedcar", scs); new ServerGUI(scs); this.dispose(); }
Så hvis serveren kører bag en router med NAT skal der være åbnet for 2 porte (og man skal gøre lidt for at bestemme hvilken port serveren skal lytte på).
arne_v - kan du forklare hvad (eller hvordan) det præcist skal gøres, - jeg har nemlig præcist det samme problem som jesperhw.... - og jeg kan ikke finde ud af at "tvinge" kommunikationen igennem en bestemt port!!
Undskyld jeg ikke har givet lyd fra mig før nu - har haft andet at lave...
Jeg har lige prøvet det eksempel af som ligger sammen med nævnte artikel (indeholder en server + client). Inden jeg prøvede eksemplet var jeg inde og åbne ALLE porte i routeren (forhåbentlig), så det burde være lige meget hvilke porte der blev lyttet på. Men efter at have startet serveren og derefter klienten kører de begge et par sekunder og så spytter klient-konsollen følgende fejl ud:
java.rmi.ConnectException: Connection refused to host: 192.168.1.3; nested excep tion is: java.net.ConnectException: Connection refused: 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) at ServerImpl_Stub.toUpperCase(Unknown Source) at Client.run(Client.java:29) at java.lang.Thread.run(Thread.java:536) Caused by: java.net.ConnectException: Connection refused: connect
..osv.
Klienten kan altså ikke connecte til 192.168.1.3 som er pc'ens interne ip. Det tyder altså på at jeg ikke har fået åbnet for alle porte alligevel. Nu ved jeg ikke hvor meget du kender til Cisco 677 routeren fra Tiscali, men jeg brugte denne kommando i Hyperterminal:
set nat entry add 192.168.1.3 1025-65535 <min faste IP her> 1025-65535 tcp
og en tilsvarende for udp.
Ved du om det er nok til at åbne alle portene fra 1025 og op?
Rmiregistry ligger på 1099. Den hjemmelavede socket factory sætter ServerSocket for server-objektet til 1098.
Har nu åbnet for disse 2 porte. Men såvidt jeg kan se prøver den kaldende klient også at bruge port 1098? I hvert fald får den ikke lov at connecte - jeg får samme række exceptions som før.
Jeg har nu også prøvet eksemplet nogle gange, og får præcis samme exception som Jesper - uanset hvilken computer(og router) jeg lader være server/klient.
Du har lavet en kombineret server og rmiregistry med en socket factory som returnerer 1098 og 1099, du har åbnet for port 1098 og 1099 i routeren, og du kan ikke connecte ?
Ja, ja, ja - og nej! Det kan lyde underligt, - men det er altså faktum, og hvis det "ikke kan lade sig gøre", så tror jeg kun det kan være de routere, som jeg har prøvet eksemplet med, der kan være årsag til problemet. Det virker fint når jeg bare kører lokalt, - men ikke når jeg bruger maskiner, der ikke er på samme netværk. Har du prøvet det i praksis arne_v?
Jeg tror du har ret i, at det ikke er specielt smart som WAN-løsning.. - men jeg er i en situation, hvor det vil være rart at være på den sikre side.. - altså at få det til at virke alligevel.
Det ku' da være sjovt at se, om du kan få det til at virke.. - evt. med det eksempel, som du selv har linket til! - Det ser i hvert fald ud som om, at dette eksempel kan tvinge igennem på en bestemt port - så mangler vi bare at komme igennem denne port :-)
Det ser ud til, at du har fat i noget..! - Jeg har dog ikke fået det til at virke enenu, men nu får jeg en AccessControlException.
Måske er det noget der kan løses via java.policy eller java.security i C:\j2sdk1.4.1_02\jre\lib\security - eller hva'? - Har du gjort noget ved disse filer?
Utroligt - men desværre; jeg kan stadig ikke få det til at virke. Jeg er kommet ud over problemet med AccessControlException, - jeg kører med all granted, men får stadig en ConnectException??
Det virker stadig, hvis jeg forsøger fra min egen pc via min eksterne IP, men ikke når jeg forsøger med to computere over internettet? Den finder rigtigt nok ud af hvilken IP min server har indenfor routeren, men får altså ikke adgang af en eller anden årsag... - Har du gjort andre sikkerhedsmæssige tiltag end all granted i java.policy?
Så er jeg - efter nogen tid med andre gøremål - tilbage ved et snart gammelt problem, som jeg stadig ikke er i stand til at løse! - Nedenfor har jeg bragt en udskrift af fejlen. I eksemplet har jeg forsøgt at tilgå en simpel server med metoden sigHej() - placeret på en kammerats computer med all granted i begge ender og ved brug af den factory, som du tidligere har posted. IP'en 10.0.0.4 er adressen bag routeren, så den bliver dirrigeret det rigtige sted hen, men ender altså med time-out...
Håber du kan hjælpe!
java.rmi.ConnectException: Connection refused to host: 10.0.0.4; 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) at Server_Stub.sigHej(Unknown Source) at Klient.test(Klient.java:21) at Klient.main(Klient.java:38)
Caused by: java.net.ConnectException: Connection timed out: connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:305) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:171) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:158) at java.net.Socket.connect(Socket.java:426) at java.net.Socket.connect(Socket.java:376) at java.net.Socket.<init>(Socket.java:291) at java.net.Socket.<init>(Socket.java:119) at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22) at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128) at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:562) ... 6 more
Hej Blev der nogen løsning på dette problem da jeg nu sidder men en Cisco router 2600XM der giver samme symtomer som ovenstående. Har alle porte åbne og anvender 80 1099 1098. Alt virker fint når jeg ikke anvender router men får security problemer når router komme imellem.
således at serveren der kører på indvendig side af firewallen kan fortælle den rigtige adresse til client (som jo skal connecte til den eksterne adresse)
Ovenstående forklaring kommer fra dem der har sat routeren op. Jeg skriver mig dette bag øret og takker for svaret. :-)
Synes godt om
Ny brugerNybegynder
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.