Cas très déroutant: "java. net. ConnectException: Connexion refusée" par certains hôtes (une fois cette exception, une fois non!)


J'ai une classe tout à fait normale en Java pour la connexion HTTP pour obtenir un en-tête HTTP responce d'un serveur. Je semble être absolument correct, et cela fonctionne réellement bien pour la plupart des sites Web que j'ai testés. Mais..

    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();
            }
        }
    }

MAIS il y a quelques sites, et en les testant avec cette classe, j'obtiens une fois l'exception "java.net.ConnectException: Connection refused" et l'heure seconde ... cela fonctionne bien (par le même nom d'hôte) et j'obtiens une réponse! Et il va sur et ainsi de suite. Une fois une réponse une fois une exception.

Exception:

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)

Lorsque je teste le même nom d'hôte dans le navigateur, je deviens toujours une réponse. Lorsque je teste le même nom d'hôte dans curl (ubuntu), j'obtiens toujours une réponse non plus (donc dans les deux cas, aucune exception).

Je suis vraiment confus, veuillez écrire si vous avez des idées. Merci beaucoup!

Author: Oli, 2016-10-18

2 answers

Java.net.ConnectException se produit lorsque vous travaillez avec une architecture client-serveur et que vous essayez d'établir une connexion TCP du client au serveur. Maintenant, il y a plusieurs raisons pour que cela se produise. Je comprends dans votre cas que cela se produit par intermittence c'est-à-dire que parfois cela fonctionne et parfois non.

Il ne semble pas y avoir de problème avec votre code client, que ce soit le serveur ou le réseau. Le réseau / pare-feu est rarement intermittent. Je vous suggère de le faire série de tests (ping/curl etc) sur le serveur, ce qui semble être le problème ici.

En outre, vous pouvez également incorporer un morceau de ce code dans votre client pour mieux déboguer le problème. Si tout échoue, parlez - en à votre équipe de réseautage.

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

Maintenant, je peux donner une réponse avec les informations de mon dernier commentaire:

Wireshark m'a donné un indice, par des connexions avec le port source > 45000 la connexion sera acceptée, par des ports plus petits not.By première connexion Java a choisi le port source36846 et par seconde un 45852, donc le second passe Le curl a également utilisé 2 essais: un avec un port plus petit et un avec un plus grand (> 51000) donc ça passe aussi. Le navigateur utilise le premier port de temps > 45000.

Résultat: semble être une chute de feumal configurée .

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