簡體   English   中英

如何在Apache HttpComponents中使用自定義socketfactory

[英]How to use a custom socketfactory in Apache HttpComponents

我一直在嘗試在Apache HTTPComponents項目的httpclient庫中使用自定義SocketFactory。 到目前為止沒有運氣。 我原以為我可以為HttpClient實例設置套接字工廠,但顯然不是那么容易。

http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html上的HttpComponents文檔確實提到了套接字工廠,但沒有說明如何使用它們。

有誰知道這是怎么做的?

我們使用自定義套接字工廠允許HttpClient連接使用不受信任的證書連接到HTTPS URL。

我們是這樣做的:

  1. 我們從Oleg引用的示例源目錄中調整了'EasySSLProtocolSocketFactory'和'EasyX509TrustManager'類的實現。

  2. 在我們的HttpClient啟動代碼中,我們執行以下操作以啟用新的套接字工廠:

     HttpClient httpClient = new HttpClient(); Protocol easyhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443); Protocol.registerProtocol("https", easyhttps); 

因此,只要我們請求https:// URL,就會使用此套接字工廠。

oleg的答案當然是正確的,我只是想直接把信息放在這里,以防鏈接變壞。 在創建HttpClient的代碼中,我使用此代碼讓它使用我的套接字工廠:

    CustomSocketFactory socketFactory = new CustomSocketFactory();
    Scheme scheme = new Scheme("http", 80, socketFactory);
    httpclient.getConnectionManager().getSchemeRegistry().register(scheme);

CustomSocketFactory是我自己的套接字工廠,我想將它用於普通的HTTP流量,這就是我使用"http"80作為參數的原因。

我的CustomSchemeSocketFactory看起來類似於:

public class CustomSchemeSocketFactory implements SchemeSocketFactory {

  @Override
  public Socket connectSocket( Socket socket, InetSocketAddress remoteAddress, InetSocketAddress localAddress, HttpParams params ) throws IOException, UnknownHostException, ConnectTimeoutException {

    if (localAddress != null) {
      socket.setReuseAddress(HttpConnectionParams.getSoReuseaddr(params));
      socket.bind(localAddress);
    }
    int connTimeout = HttpConnectionParams.getConnectionTimeout(params);
    int soTimeout = HttpConnectionParams.getSoTimeout(params);

    try {
        socket.setSoTimeout(soTimeout);
        socket.connect(remoteAddress, connTimeout );
    } catch (SocketTimeoutException ex) {
        throw new ConnectTimeoutException("Connect to " + remoteAddress + " timed out");
    }

    return socket;
  }

  @Override
  public Socket createSocket( HttpParams params ) throws IOException {
    // create my own socket and return it
  }

  @Override
  public boolean isSecure( Socket socket ) throws IllegalArgumentException {
    return false;
  }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM