Caso molto confuso: "java. net. ConnectException: connessione rifiutata" da alcuni host (una volta questa eccezione, una volta no!)


Ho una classe totalmente normale in Java per la connessione HTTP per ottenere intestazioni di risposta HTTP da un server. Mi sembra di essere absolut bene, ed è in realtà funziona bene per la maggior parte dei siti web che ho testato. Ma..

    import java.net.HttpURLConnection;
    import java.net.URL;
    public class Main2 {
        public static void main(String[] args) {
            HttpURLConnection.setFollowRedirects(false);
            HttpURLConnection con = null;
            try {
                URL url = new URL("http://sometestsite.blabla/");
                con = (HttpURLConnection) url.openConnection();
                con.setRequestMethod("GET");
                con.connect();

                System.out.println(con.getHeaderField("Server"));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

MA ci sono alcuni siti, e testandoli con questa classe, ottengo una volta "java.net.ConnectException: Connection refused" Exception e secound time ... funziona bene (con lo stesso nome host) e ottengo una risposta! E va così avanti e così via. Una volta una risposta una volta un'eccezione.

Eccezione:

java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at java.net.Socket.connect(Socket.java:538)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:180)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:432)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:527)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:211)
    at sun.net.www.http.HttpClient.New(HttpClient.java:308)
    at sun.net.www.http.HttpClient.New(HttpClient.java:326)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1169)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1105)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:999)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:933)
    at Main2.main(Main2.java:14)

Quando provo lo stesso nome host nel Browser, divento sempre una risposta. Quando provo lo stesso nome host in curl (ubuntu), ottengo sempre una risposta (quindi in entrambi i casi nessuna eccezione).

Sono davvero confuso, per favore scrivi se hai qualche idea. Grazie mille!

Author: Oli, 2016-10-18

2 answers

Java.net.ConnectException si verifica quando si lavora con l'architettura client-server e si tenta di effettuare la connessione TCP dal client al server. Ora ci sono molte ragioni per cui ciò accada. Capisco che nel tuo caso sta accadendo in modo intermittente cioè a volte funziona ea volte no.

Non sembra esserci alcun problema con il codice client, sia il server che la rete. Rete / Firewall è raramente intermittente. Ti suggerirei di farlo serie di test (ping / curl ecc.) sul server, questo sembra essere il problema qui.

Inoltre puoi anche incorporare parte di questo codice nel tuo client per eseguire il debug migliore del problema. Se tutto fallisce, parla con il tuo team di networking del problema.

public class TestServer {
    public static void main(String[] args){
        try{
            InetAddress address = InetAddress.getByName("192.168.1.1");
            boolean reachable = address.isReachable(10000);
            System.out.println("Host reachable? " + reachable);
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}
 1
Author: Himalay Majumdar, 2016-10-18 13:49:11

Ora posso dare una risposta con informazioni dal mio ultimo commento:

Wireshark mi ha dato un suggerimento, dalle connessioni con la porta sorgente > 45000 la connessione sarà accettata, da porte più piccole not.By prima connessione Java ha scelto la porta sorgente 36846 e secondo uno 45852, quindi il secondo passa Il ricciolo utilizzato anche 2 trys: uno con una porta più piccola e uno con una più grande (> 51000) quindi passa anche questo. Il browser utilizza la porta per la prima volta > 45000.

Risultato: sembra essere un missconfigured firefall .

 0
Author: Oli, 2016-11-13 11:55:09