Jersey REST ClientHandlerException:java.net.ConnectException:连接超时:connect

时间:2017-08-28 10:16:42

标签: java rest web-services jersey-client

我们尝试使用 HTTPS 基本身份验证编写一个休息客户端。代码如下。我得到以下例外:

  

java.net.ConnectException:连接超时:连接

任何人都可以帮我找到我做错的事吗?

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) {
            }
        }


    }

1 个答案:

答案 0 :(得分:0)

此例外

java.net.ConnectException: Connection timed out: connect

除了在给定的超时内通过套接字级别的给定端口连接到给定IP /主机不可能的意思,在你的情况下足够大,以排除超时值本身的考虑

在99%的情况下,当来自请求者网络的给定端口 无法访问时,会发生这种情况,实际上并不取决于编写的代码。< / p>

假设 someIP不是代码中的拼写错误,从此时开始,您将someIP替换为实际的真实IP地址

  

https://someIP:443/rest/api/topology/servicesnodes

您可以尝试在浏览器中打开整个链接,看看它是否在您的代码之外工作。

此外,您可以验证someIP端口可以从您的代码启动位置访问443。为此,请在运行代码的服务器上从命令行执行以下命令:

telnet someIP 443
  • 您应该获得类似Connected to someIP. Escape character is '^]'.的内容,表示连接成功。按Ctrl + C退出会话
  • 如果telnet挂起消息Trying someIP...或以其他方式指示错误 - 确认通过给定端口无法访问给定IP

无法访问IP的典型案例可以是

  • 错误的IP。例如。你正在尝试使用私有IP而不是公共IP
  • 错误的港口。在服务器正在侦听时尝试访问默认值443,例如8443
  • 位于给定IP上的服务器已关闭
  • 不期望您尝试访问IP的子网。例如。在IP所有者方面没有列入白名单(或者,例如,您必须在VPN中与所有者的网络进行访问,或者需要配置代理等)。
  • 中间的安全代理限制访问(防火墙等)
  • ...

所有这些案件都需要联系IP /主机所有者以进一步澄清。

修改

查看此answer以及'debug'程序说明