【问题标题】:How to use a custom socketfactory in Apache HttpComponents如何在 Apache HttpComponents 中使用自定义 socketfactory
【发布时间】:2011-11-22 13:27:21
【问题描述】:

我一直在尝试在 Apache HTTPComponents 项目的 httpclient 库中使用自定义 SocketFactory。到目前为止没有运气。我期待我可以为 HttpClient 实例设置一个套接字工厂,但这显然不是那么容易。

http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html 的 HttpComponents 文档确实提到了套接字工厂,但没有说明如何使用它们。

有人知道这是怎么做到的吗?

【问题讨论】:

标签: java apache-httpclient-4.x apache-httpcomponents socketfactory


【解决方案1】:

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

}

【讨论】:

    【解决方案2】:

    我们使用自定义套接字工厂来允许 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 时,都会使用此套接字工厂。

    【讨论】:

    • 如果我没记错的话,EasySSLProtocolSocketFactory 是一个 HttpClient 3 类。它在较新的 HttpComponents 客户端 v4 中不可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 2021-05-31
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    相关资源
    最近更新 更多