Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    14

    [Java]ServerSocket funzionante in locale e in remoto ma non da locale con ip pubblico

    Salve a tutti, vi scrivo per esporvi un problema che mi sta facendo letteralmente uscire matto,
    ho un programma scritto in java, in cui non faccio altro che mettermi in ascolto su di una porta, e un altro programma sempre scritto in java in cui mi connetto tramite socket al programma precedente.

    Il server si avvia senza alcun problema.
    L'ambiguità è:
    - Se da locale, provo a connettermi tramite indirizzo "localhost" o "127.0.0.1" la connessione viene stabilita con successo
    - Se utilizzo un servizio come http://www.canyouseeme.org/ per testare la porta in questione, risulta aperta, e il server riceve la connessione, quindi funziona da remoto.

    invece:
    - Se da locale provo a connettermi, tramite il mio indirizzo ip pubblico effettivo (o meglio, quello del mio router, dove ho provveduto ad attivare il NAT per la porta necessaria verso il mio pc), la connessione non si stabilisce.

    In poche parole, in localhost mi connetto, un server web esterno si connette con me, ma se io provo a connettermi passando attraverso il mio router, non da segni di vita.
    Eppure il router stesso è raggiungibile,sia dall'esterno, che dall'interno, ma è come se la mia applicazione gli stesse "antipatica".

    Premetto che è attivato solamente il firewall di windows, e non blocca i due programmi in questione.

    Per essere sicuro che l'errore non sia nel codice sorgente del mio programma, ve lo allego (non è molto lungo, l'ho scritto solo per testare questo problema):

    Client
    codice:
    package simpletcpclient; 
    import java.net.*;  
    
    public class Main {     
      private static final String IP = "localhost";     
      private static final int PORT = 90;      
    
      public static void main(String[] args) {       
       System.out.println("Attempting to connect to " + IP + " on port " + PORT + "...");       
       try {         
        Socket s = new Socket(IP, PORT);         System.out.println("Succesful!");             
        s.close();       
       } catch(Exception exc) {         
        System.out.println("There was a problem. " + exc.getLocalizedMessage());       
       }    
     }  
    }
    Server
    codice:
    package simpletcpserver; 
    import java.net.*;  
    
    public class Main {      
      public final static int PORT = 90;  
        
      public static void main(String[] args) {      
      try {         
       ServerSocket ss = new ServerSocket(PORT);         
       System.out.println("Listening on port" + PORT);          
       while(true) {           
        ss.accept().close();           
        System.out.println("Accepted and closed connection");         
       }       
      } catch(Exception exc) {         
        System.out.println("An error occurred." + exc.getMessage());       
      } 
     }  
    }
    Sono su un portatile, connesso tramite wi-fi, al mio router (quello tipico Alice della telecom), il problema è un mistero.
    Qualcuno ha già avuto questi comportamenti? Avete qualche idea su come potrei venirne a capo? Grazie in anticipo.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java]ServerSocket funzionante in locale e in remoto ma non da locale con ip pubblico

    Originariamente inviato da Pharanoise
    In poche parole, in localhost mi connetto, un server web esterno si connette con me, ma se io provo a connettermi passando attraverso il mio router, non da segni di vita.
    Facciamo una premessa, che è d'obbligo in discussioni come la tua. Questa non è tanto una questione di "programmazione" in un linguaggio XYZ ma è più che altro principalmente una questione "sistemistica" a livello di networking! Il problema insomma ... non è Java.

    Ho fatto una prova, io ho Win2000 e non ho firewall sw ma solo quello del router. Effettivamente stessa cosa a me (quindi non è solo un tuo problema), ovvero locale->locale Ok, remoto (il servizio indicato)->locale Ok ma locale->remoto->locale No.

    Ora ... io non sono un guru sul networking ma credo che ci siano questioni legate a come il router tratta questa "uscita" e poi rientro. Dovrei documentarmi .... (se qualcuno ha idea, ben venga).

    Ma la questione piuttosto è un'altra! Questa tua prova che da locale cerchi di connettersi al IP "pubblico" (uscendo) che poi alla fin fine dovrebbe rientrare sul server sempre in locale da te .... non è il caso reale di utilizzo!!!

    Insomma, il caso più reale/utile è che tu offri un servizio su una certa porta e ammesso che hai configurato router/firewall e quant'altro per avere la porta "aperta" (e se il tuo ISP non la blocca) allora da "internet" è visibile e usabile.
    E come hai detto chiaramente, la prova da quel servizio online di port check ... funziona. Ed è questo che conta. Punto.

    Se poi vuoi sapere perché quel caso particolare menzionato non funziona .... beh, mi documento o se qualcuno ha idea ora meglio di me, ben venga.

    Ma non complicarti la vita e non tentare elucubrazioni strane per casi particolari e comunque non davvero "reali".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    14
    Ti ringrazio per le spiegazioni, in effetti non è molto pertinente allo specifico linguaggio di programmazione, ma non sapendo dove fosse effettivamente il problema ho pensato di chiarire i dubbi...

    In effetti sono consapevole del fatto che questo utilizzo che ne faccio sia completamente fuori da ogni risvolto pratico, però ho pensato che dal momento che presenta dei problemi in questo caso (che dal punto di vista teorico non dovrebbero esserci), potrebbe presentarne anche al momento di utilizzo vero e proprio, ovvero da esterno verso il mio router e poi verso la mia macchina.

    Non ho ancora avuto modo di provarlo in queste circostanze, lo farò quanto prima per esserne sicuro...
    Se hai modo di scoprire qualcosa mi piacerebbe saperne di più

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Pharanoise
    però ho pensato che dal momento che presenta dei problemi in questo caso (che dal punto di vista teorico non dovrebbero esserci), potrebbe presentarne anche al momento di utilizzo vero e proprio, ovvero da esterno verso il mio router e poi verso la mia macchina.
    Lo ripeto ancora una volta, sperando che sia più chiaro.

    Il test più realistico hai detto di averlo fatto e funziona (così come funziona da me), ovvero hai configurato firewall hw e/o sw e quant'altro per "aprire" la porta verso la tua macchina che è sulla rete locale e poi con il programma "server" avviato hai provato quel servizio online di port check.
    Funziona? Sì? Bene, questo è tutto. Hai fatto quello che è nelle tue possibilità e che è sotto il tuo controllo per consentire l'accesso al tuo servizio da internet.

    Se poi per la tua connessione a internet cambiassi ISP che magari blocca quella porta oppure se qualcun'altro che volesse usare il tuo servizio usa un ISP oppure è "dietro" un firewall aziendale che blocca quella porta .... beh, ovviamente il tuo "servizio" non sarebbe usabile ma d'altronde non solo non puoi sapere chi/come cercherebbe di usare il tuo servizio ma oltretutto non potresti farci un bel nulla perché non è sotto il tuo controllo!!

    Ora è più chiaro?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    14
    Certo è logico che se vi sono delle limitazioni dal lato del client che tenta di connettersi al mio server, io non vi ho nessun controllo ed è normale che non riesca a connettersi, non lo metto nemmeno in dubbio..

    Non è altrettanto normale però, che io, sebbene non abbia nessuna limitazione apparente, non riesca a contattare me stesso passando attraverso il mio router.

    Ora, lo so che ho fatto tutto quello che era in mio potere, e che il problema probabilmente potrebbe essere la politica adottata dal mio router, ma a puro titolo informativo mi piacerebbe sapere "come mai" questo avviene, per potermi spiegare il fatto.

    Non esigo che mi venga detto il perchè, ma se qualcuno lo sapesse, mi farebbe piacere conoscere il motivo.

    Comunque mi hai dato già una risposta più che sufficiente per inquadrare almeno dove stia il problema, grazie dell'aiuto

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Pharanoise
    Non è altrettanto normale però, che io, sebbene non abbia nessuna limitazione apparente, non riesca a contattare me stesso passando attraverso il mio router.
    E invece è normalissimo.
    Da una rete interna non puoi accedere ad un altra macchina della rete interna, passando da un IP pubblico (quindi esterno), per il semplice fatto che il tuo router non può controllare una richiesta che va verso l'esterno e che rientra con lo stesso header.

    E' per questo che esiste il file HOSTS (Linux: /etc/hosts, Windows: %WinDir%\System32\drivers\etc\hosts).

    Ad ogni modo, non è un problema legato a Java, quanto piuttosto un problema legato alle infrastrutture di rete... e c'è il forum apposito per questo (Reti Lan e Wireless). Se ritieni opportuno, sposto la discussione lì che ti sapranno spiegare il perchè meglio di me.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    14
    Originariamente inviato da LeleFT
    E invece è normalissimo.
    Da una rete interna non puoi accedere ad un altra macchina della rete interna, passando da un IP pubblico (quindi esterno), per il semplice fatto che il tuo router non può controllare una richiesta che va verso l'esterno e che rientra con lo stesso header.

    E' per questo che esiste il file HOSTS (Linux: /etc/hosts, Windows: %WinDir%\System32\drivers\etc\hosts).

    Ad ogni modo, non è un problema legato a Java, quanto piuttosto un problema legato alle infrastrutture di rete... e c'è il forum apposito per questo (Reti Lan e Wireless). Se ritieni opportuno, sposto la discussione lì che ti sapranno spiegare il perchè meglio di me.


    Ciao.
    Non gli è possibile essere mittente e destinatario di un pacchetto? Per qual motivo? (Forse è una cosa scontatissima, ma evidentemente non ne ho mai sentito parlare prima )
    In ogni caso mi faresti un favore spostando la discussione si, ora che ci penso ho sbagliato sezione...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.