4

Apache HTTPComponents プロジェクトの httpclient ライブラリでカスタム SocketFactory を使用しようとしています。これまでのところ運が悪い。HttpClient インスタンスのソケット ファクトリを設定できると思っていましたが、明らかに簡単ではありません。

http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.htmlにあるHttpComponents のドキュメントには、ソケット ファクトリについては言及されていますが、その使用方法については言及されていません。

これがどのように行われるか知っている人はいますか?

4

2 に答える 2

3

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;
  }

}
于 2011-11-22T14:28:16.827 に答える
2

カスタムソケットファクトリを使用して、HttpClient接続が信頼できない証明書を使用してHTTPSURLに接続できるようにします。

これが私たちがそれをした方法です:

  1. Olegによって参照されるサンプルソースディレクトリから、「EasySSLProtocolSocketFactory」クラスと「EasyX509TrustManager」クラスの両方の実装を適応させました。

  2. HttpClientスタートアップコードでは、次の手順を実行して、新しいソケットファクトリを有効にします。

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

そのため、https:// URLをリクエストするたびに、このソケットファクトリが使用されます。

于 2011-11-22T14:24:58.657 に答える