ConnectException 在一台机器上但在另一台机器上没有
ConnectException on one machine but not on another
我有以下代码片段:
private static String post(String msg) throws Exception {
URL urlObj = new URL(host);
HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();
System.out.println(String.format("Send to url [%s]", urlObj));
System.out.println(String.format("Port [%s]", con.getURL().getDefaultPort()));
System.out.println(String.format("POST data [%s]", msg));
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(msg);
wr.flush();
wr.close();
int respCode = con.getResponseCode();
System.out.println(String.format("Response code [%s]", respCode));
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String response = "", s;
while ((s = in.readLine()) != null) {
response += s;
}
in.close();
return response;
}
此方法是接受 yyyyMMdd 日期字符串的程序的一部分,将其包装在 JSON 中,以 base 64 加密 JSON 字符串,然后将其发送到 https 网络服务作为查询。
我运行我个人笔记本电脑上的程序,连接到互联网,能够成功查询和处理结果。我还可以访问 Web 服务 URL 并手动提交查询。
然而,在我通过代理连接到互联网的服务器上,我仍然可以通过浏览器手动查询网络服务,但我现在在 运行 相同的程序时出现异常:
java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:625)
at sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:160)
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.protocol.https.HttpsClient.<init>(HttpsClient.java:264)
at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:933)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1092)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250)
at com.chinkai.EvaWSAgent.post(EvaWSAgent.java:87)
at com.chinkai.EvaWSAgent.retrieve(EvaWSAgent.java:50)
at com.chinkai.EvaWSAgent.main(EvaWSAgent.java:155)
...第 87 行是
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
我不确定如何解决这个问题,或者是否有任何方法可以重写这个方法来绕过,或者这是否是我的问题(也许是代理中的设置?)不确定如果这里是提出这个问题的正确地点,但我还是要试试运气。
如果服务器通过代理连接到互联网,您还需要在您的应用程序中进行设置,例如像那样:
URL urlObj = new URL(host);
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy.yourdomain.com", 3128));
HttpURLConnection con = (HttpURLConnection) urlObj.openConnection(proxy);
您可以按照其他人的建议在代码中设置代理。您也可以在 运行 Java 应用程序时从命令行设置它。
java -jar myapp.jar -Dhttp.proxyHost=proxy.mycorp/com -Dhttp.proxyPort=8080
我有以下代码片段:
private static String post(String msg) throws Exception {
URL urlObj = new URL(host);
HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();
System.out.println(String.format("Send to url [%s]", urlObj));
System.out.println(String.format("Port [%s]", con.getURL().getDefaultPort()));
System.out.println(String.format("POST data [%s]", msg));
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(msg);
wr.flush();
wr.close();
int respCode = con.getResponseCode();
System.out.println(String.format("Response code [%s]", respCode));
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String response = "", s;
while ((s = in.readLine()) != null) {
response += s;
}
in.close();
return response;
}
此方法是接受 yyyyMMdd 日期字符串的程序的一部分,将其包装在 JSON 中,以 base 64 加密 JSON 字符串,然后将其发送到 https 网络服务作为查询。
我运行我个人笔记本电脑上的程序,连接到互联网,能够成功查询和处理结果。我还可以访问 Web 服务 URL 并手动提交查询。
然而,在我通过代理连接到互联网的服务器上,我仍然可以通过浏览器手动查询网络服务,但我现在在 运行 相同的程序时出现异常:
java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:625)
at sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:160)
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.protocol.https.HttpsClient.<init>(HttpsClient.java:264)
at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:933)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1092)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250)
at com.chinkai.EvaWSAgent.post(EvaWSAgent.java:87)
at com.chinkai.EvaWSAgent.retrieve(EvaWSAgent.java:50)
at com.chinkai.EvaWSAgent.main(EvaWSAgent.java:155)
...第 87 行是
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
我不确定如何解决这个问题,或者是否有任何方法可以重写这个方法来绕过,或者这是否是我的问题(也许是代理中的设置?)不确定如果这里是提出这个问题的正确地点,但我还是要试试运气。
如果服务器通过代理连接到互联网,您还需要在您的应用程序中进行设置,例如像那样:
URL urlObj = new URL(host);
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy.yourdomain.com", 3128));
HttpURLConnection con = (HttpURLConnection) urlObj.openConnection(proxy);
您可以按照其他人的建议在代码中设置代理。您也可以在 运行 Java 应用程序时从命令行设置它。
java -jar myapp.jar -Dhttp.proxyHost=proxy.mycorp/com -Dhttp.proxyPort=8080