Jersey REST ClientHandlerException:java.net.ConnectException:连接超时:连接
Jersey REST ClientHandlerException: java.net.ConnectException: Connection timed out: connect
我们尝试使用 HTTPS 和 Basic Auth 编写一个休息客户端。代码如下。我收到以下异常:
java.net.ConnectException: Connection timed out: connect
谁能帮我找出我做错了什么?
public class sampleMain {
public static void main(String[] args) {
ClientConfig clientConfig = new DefaultClientConfig();
/* clientConfig.getProperties().put(ClientConfig.PROPERTY_FOLLOW_REDIRECTS, true);*/
clientConfig.getProperties().put(ClientConfig.PROPERTY_READ_TIMEOUT, 300000);
clientConfig.getProperties().put(ClientConfig.PROPERTY_CONNECT_TIMEOUT, 30000);
disableSslVerification(clientConfig);
Client client = Client.create(clientConfig);
client.setFollowRedirects(true);
HTTPBasicAuthFilter authenticationFilter = new HTTPBasicAuthFilter("admin", "APP@#1234");
client.addFilter(authenticationFilter);
WebResource webResource = client.resource("https://someIP:443/rest/api/topology/servicesnodes");
ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
System.out.println(response);
}
//below method is used to set ssl context to clientconfig as https property
private static void disableSslVerification(ClientConfig clientConfig) {
try {
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
} };
// Install the all-trusting trust manager
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
clientConfig.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new HTTPSProperties(new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
}, sc));
} catch (NoSuchAlgorithmException ae1) {
} catch (KeyManagementException e) {
}
}
}
这个异常
java.net.ConnectException: Connection timed out: connect
仅表示不可能在给定超时内通过套接字级别上的给定端口连接到给定 IP/host,这在您的情况下足够大,可以将超时值本身排除在考虑范围之外
当给定 IP/host 根本无法通过请求者网络的给定端口 时,99% 的情况都会发生这种情况, 实际上并不取决于写的代码.
假设 someIP 不是您代码中的拼写错误,并且从这一点开始,您将 someIP
替换为 实际的真实 IP 地址:
您可以尝试在浏览器中打开整个 link 以查看它是否在您的代码之外工作。
此外,您可以验证 someIP
是否可以从 443
端口 从您的代码启动的地方 访问。为此,在运行代码的服务器上从命令行执行以下命令:
telnet someIP 443
- 您应该会看到类似
Connected to someIP. Escape character is '^]'.
的内容,这表明连接成功。按 Ctrl+C 退出会话
- 如果 telnet 挂起并显示消息
Trying someIP...
或以其他方式指示错误 - 确认无法通过给定端口访问给定 IP
无法访问IP的典型情况可以
- IP 错误。例如。您正在尝试使用私有 IP 而不是 public 一个
- 端口错误。在服务器侦听时尝试访问默认 443,例如 8443
- 位于给定 IP 的服务器已关闭
- 您尝试访问 IP 的子网不是预期的。例如。未在 IP 所有者方列入白名单(或者,例如,您必须在所有者网络的 VPN 中才能访问它,或者需要配置代理等)
- 中间的安全代理正在限制访问(防火墙等)
- ...
所有这些情况都需要联系 IP/host 所有者以进一步澄清。
编辑
查看此 answer 以及 'debug' 程序描述
我们尝试使用 HTTPS 和 Basic Auth 编写一个休息客户端。代码如下。我收到以下异常:
java.net.ConnectException: Connection timed out: connect
谁能帮我找出我做错了什么?
public class sampleMain {
public static void main(String[] args) {
ClientConfig clientConfig = new DefaultClientConfig();
/* clientConfig.getProperties().put(ClientConfig.PROPERTY_FOLLOW_REDIRECTS, true);*/
clientConfig.getProperties().put(ClientConfig.PROPERTY_READ_TIMEOUT, 300000);
clientConfig.getProperties().put(ClientConfig.PROPERTY_CONNECT_TIMEOUT, 30000);
disableSslVerification(clientConfig);
Client client = Client.create(clientConfig);
client.setFollowRedirects(true);
HTTPBasicAuthFilter authenticationFilter = new HTTPBasicAuthFilter("admin", "APP@#1234");
client.addFilter(authenticationFilter);
WebResource webResource = client.resource("https://someIP:443/rest/api/topology/servicesnodes");
ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
System.out.println(response);
}
//below method is used to set ssl context to clientconfig as https property
private static void disableSslVerification(ClientConfig clientConfig) {
try {
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
} };
// Install the all-trusting trust manager
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
clientConfig.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new HTTPSProperties(new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
}, sc));
} catch (NoSuchAlgorithmException ae1) {
} catch (KeyManagementException e) {
}
}
}
这个异常
java.net.ConnectException: Connection timed out: connect
仅表示不可能在给定超时内通过套接字级别上的给定端口连接到给定 IP/host,这在您的情况下足够大,可以将超时值本身排除在考虑范围之外
当给定 IP/host 根本无法通过请求者网络的给定端口 时,99% 的情况都会发生这种情况, 实际上并不取决于写的代码.
假设 someIP 不是您代码中的拼写错误,并且从这一点开始,您将 someIP
替换为 实际的真实 IP 地址:
您可以尝试在浏览器中打开整个 link 以查看它是否在您的代码之外工作。
此外,您可以验证 someIP
是否可以从 443
端口 从您的代码启动的地方 访问。为此,在运行代码的服务器上从命令行执行以下命令:
telnet someIP 443
- 您应该会看到类似
Connected to someIP. Escape character is '^]'.
的内容,这表明连接成功。按 Ctrl+C 退出会话 - 如果 telnet 挂起并显示消息
Trying someIP...
或以其他方式指示错误 - 确认无法通过给定端口访问给定 IP
无法访问IP的典型情况可以
- IP 错误。例如。您正在尝试使用私有 IP 而不是 public 一个
- 端口错误。在服务器侦听时尝试访问默认 443,例如 8443
- 位于给定 IP 的服务器已关闭
- 您尝试访问 IP 的子网不是预期的。例如。未在 IP 所有者方列入白名单(或者,例如,您必须在所有者网络的 VPN 中才能访问它,或者需要配置代理等)
- 中间的安全代理正在限制访问(防火墙等)
- ...
所有这些情况都需要联系 IP/host 所有者以进一步澄清。
编辑
查看此 answer 以及 'debug' 程序描述