2017-08-28 172 views
0

我們試着寫一個REST客戶端與HTTPS基本認證。代碼如下。我得到以下異常:新澤西州的REST ClientHandlerException:java.net.ConnectException:連接超時:連接

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", "[email protected]#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) { 
      } 
     } 


    } 
+0

我得到異常下面我:java.net.ConnectException:連接超時:連接 \t在java.net.DualStackPlainSocketImpl。 waitForConnect(本機方法) \t在java.net.DualStackPlainSocketImpl.socketConnect(來源不明) \t在java.net.AbstractPlainSocketImpl.doConnect(來源不明) \t在java.net.AbstractPlainSocketImpl.connectToA ddress(未知來源) \t在java.net.AbstractPlainSocketImpl.connect(未知來源) \t在java.net.PlainSocketImpl.connect(未知來源) \t在java.net.SocksSocketImpl.connect(未知來源) \t在java.net.Socket.connect(未知來源) \t at sun.security.ssl.SSL – Rockzz

+1

哪裏出現異常?如果你可以打印它堆棧跟蹤並將其添加到問題 – user7294900

回答

0

此異常

java.net.ConnectException: Connection timed out: connect 

指通過給定端口上給定的超時內的插座的水平,這是你的情況足夠大的連接到指定的IP /主機的沒有別的,但不可能,排除考慮

超時值本身給出IP /主機通過從請求網絡給定端口是可達都當這發生的病例中99%,實際上並不取決於不g代碼

假設someIP是不是在你的代碼,並從該點一個錯字以後你替換someIP實際的真實IP地址

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

你可以嘗試開放瀏覽器中的整個鏈接,看看它是否在你的代碼之外工作。

此外,您可以驗證someIP可從443端口從您的代碼正在啓動的位置訪問。爲此,執行從以下命令行運行該代碼在服務器上:

telnet someIP 443 
  • 你應該得到類似Connected to someIP. Escape character is '^]'.這將表明連接成功。按Ctrl + C退出會議
  • 如果遠程登錄有消息Trying someIP...掛起或表示其他方式的錯誤 - 這證實了給定的IP是通過給定的端口不可達

典型案例,爲什麼IP無法訪問可

  • 錯誤的IP。例如。你正在嘗試使用私有IP而不是公共密碼
  • 錯誤的端口。嘗試在服務器正在偵聽時訪問默認443 8443
  • 位於給定IP上的服務器已關閉
  • 您不希望嘗試訪問IP的子網。例如。在IP所有者方面沒有列入白名單(或者,例如,您必須通過VPN訪問所有者網絡才能訪問它,或者需要配置代理等。)在中間
  • 安全人員被限制訪問(防火牆等)
  • ...

所有這些情況都需要進一步澄清聯繫IP /主機擁有者。

編輯

看看這個answer以及與「調試」過程描述