Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
非常令人困惑的案例:“;java.net.ConnectException:连接被拒绝;由某些主机(一次出现此异常,一次未出现此异常!)_Java_Http_Connection_Httpclient_Httpurlconnection - Fatal编程技术网

非常令人困惑的案例:“;java.net.ConnectException:连接被拒绝;由某些主机(一次出现此异常,一次未出现此异常!)

非常令人困惑的案例:“;java.net.ConnectException:连接被拒绝;由某些主机(一次出现此异常,一次未出现此异常!),java,http,connection,httpclient,httpurlconnection,Java,Http,Connection,Httpclient,Httpurlconnection,我在Java中有一个完全正常的HTTP连接类,用于从服务器获取HTTP响应头。我看起来非常好,而且它在我测试过的大多数网站上都运行良好。但是 import java.net.HttpURLConnection; import java.net.URL; public class Main2 { public static void main(String[] args) { HttpURLConnection.setFollowRe

我在Java中有一个完全正常的HTTP连接类,用于从服务器获取HTTP响应头。我看起来非常好,而且它在我测试过的大多数网站上都运行良好。但是

    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();
            }
        }
    }
但也有一些站点,通过使用这个类对它们进行测试,我得到了一次“java.net.ConnectException:Connection-rejected”异常和secound-time。。。它工作正常(使用相同的主机名),我得到了答案!事情就这样继续下去。一次回答一次例外

例外情况:

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)
java.net.ConnectException:连接被拒绝
位于java.net.PlainSocketImpl.socketConnect(本机方法)
位于java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
位于java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
位于java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
位于java.net.socksocketimpl.connect(socksocketimpl.java:392)
位于java.net.Socket.connect(Socket.java:589)
位于java.net.Socket.connect(Socket.java:538)
位于sun.net.NetworkClient.doConnect(NetworkClient.java:180)
位于sun.net.www.http.HttpClient.openServer(HttpClient.java:432)
位于sun.net.www.http.HttpClient.openServer(HttpClient.java:527)
http.HttpClient.(HttpClient.java:211)
http.HttpClient.New(HttpClient.java:308)
http.HttpClient.New(HttpClient.java:326)
位于sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1169)
位于sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1105)
位于sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:999)
位于sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:933)
在Main2.main(Main2.java:14)
当我在浏览器中测试相同的主机名时,我总是得到答案。当我在curl(ubuntu)中测试相同的主机名时,我总是得到一个答案(因此在这两种情况下都没有例外)


我真的很困惑,如果你有什么想法,请写下来。非常感谢

java.net.ConnectException在您使用客户机-服务器体系结构并尝试建立从客户机到服务器的TCP连接时发生。现在有很多原因让它发生。我理解在你的情况下,它是间歇性发生的,即有时有效,有时无效

您的客户端代码似乎没有任何问题,可能是服务器或网络。网络/防火墙很少是间歇性的。我建议您在服务器上进行一系列测试(ping/curl等),这似乎就是问题所在

此外,您还可以将这段代码合并到客户机中,以便更好地调试问题。如果一切都失败了,那么就与你的人际网络团队讨论这个问题

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

现在,我可以用我上次评论中的信息给出答案:


Wireshark给了我一个提示,通过源端口>45000的连接,连接将被接受,而较小的端口则不会。通过第一次连接,Java选择源端口36846,通过secound one 45852,因此secound one通过 curl还使用了两次尝试:一次使用较小的端口,另一次使用较大的端口(>51000),这样也可以通过。浏览器使用第一时间端口>45000


结果:似乎是firefall配置错误。

这听起来像是你的网络问题,而不是应用程序的问题。@Stephen C但为什么它在curl和浏览器中工作(相同的uri,在相同的主机上,具有相同的网络设置)?@Karthik,我读过这篇文章,认为我的情况不太好,因为问题是,相同的Java代码在第一次运行时出错,在第二次运行时我得到了成功的答案。您确定在应用程序中使用的设置与在浏览器中使用的设置相同吗?例如,您是否有浏览器连接设置?您的浏览器是否使用代理等?此测试的结果是无法访问该地址,但在控制台中,我仅成为正向ping。所以这看起来像是服务器的火灾?如果你在公司网络中,我建议你加入你的网络团队,或者尝试一下WireShark数据包嗅探器。你的客户端很好。Wireshark给了我一个提示,通过源端口>45000的连接,连接将被接受,而不是被较小的端口接受。我不知道为什么,但是通过第一次连接,Java选择了源端口36846,通过secound one 45852,所以secound one通过了。