非常令人困惑的案例:“;java.net.ConnectException:连接被拒绝;由某些主机(一次出现此异常,一次未出现此异常!)
我在Java中有一个完全正常的HTTP连接类,用于从服务器获取HTTP响应头。我看起来非常好,而且它在我测试过的大多数网站上都运行良好。但是非常令人困惑的案例:“;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
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通过了。