3

我正在使用 HttpClient 4.02 通过代理创建连接(使用 CONNECT 方法)以隧道连接到远程服务器。HttpClient 对此非常方便,但我是 API 新手,看不到如何获取Socket隧道连接的底层。

以下代码取自:http: //svn.apache.org/repos/asf/httpcomponents/httpclient/tags/4.0.1/httpclient/src/examples/org/apache/http/examples/client/ClientExecuteProxy.java

    // make sure to use a proxy that supports CONNECT
    HttpHost target = new HttpHost("target.server.net", 443, "https");
    HttpHost proxy = new HttpHost("some.proxy.net", 8080, "http");

    // general setup
    SchemeRegistry supportedSchemes = new SchemeRegistry();

    // Register the "http" and "https" protocol schemes, they are
    // required by the default operator to look up socket factories.
    supportedSchemes.register(new Scheme("http", 
            PlainSocketFactory.getSocketFactory(), 80));
    supportedSchemes.register(new Scheme("https", 
            SSLSocketFactory.getSocketFactory(), 443));

    // prepare parameters
    HttpParams params = new BasicHttpParams();
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);

    ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, 
            supportedSchemes);

    DefaultHttpClient httpclient = new DefaultHttpClient(ccm, params);

    httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);

    HttpGet req = new HttpGet("/");

    System.out.println("executing request to " + target + " via " + proxy);
    HttpResponse rsp = httpclient.execute(target, req);
    HttpEntity entity = rsp.getEntity();

这很好地建立了连接,但是有没有办法获得底层Socket以便我使用自定义协议与 target.server.net 上的服务器通信?

4

3 回答 3

2

不确定我是否完全理解您的要求,但我会尽力而为...

试试这个: http: //svn.apache.org/viewvc/httpcomponents/oac.hc3x/trunk/src/examples/ProxyTunnelDemo.java ?view=markup

于 2010-09-18T14:44:30.483 回答
2

在项目的 JIRA 中打开更改请求。这个功能被忽略了。虽然将 3.x 中的 ProxyClient 等价物放在一起应该是相当简单的,但与库存版本的 HttpClient 一起发布是有意义的。

编辑:

从 4.2 版开始可用。见http://hc.apache.org/httpcomponents-client-4.3.x/httpclient/apidocs/org/apache/http/impl/client/ProxyClient.html

于 2010-09-19T14:10:52.010 回答
0

@willjcroz 在评论中说:

这样我的应用程序就可以用于防火墙后面的人,唯一的出路是网络代理。通过连接到代理,它将以 HTTPS 的形式将数据转发到目标服务器,从而提供与目标服务器的安全连接。

如果您要通过网络代理、协议感知防火墙等成功地通过隧道传输协议,则应用程序的客户端和服务器端必须符合 HTTP 协议规范。如果您(以某种方式)设法深入到套接字级别,那么您很可能会违反协议......

相反,您应该通过将数据放入 HTTP 请求和响应的内容中、在消息/响应中使用自定义 HTTP 标头、自定义内容类型等来实现自定义协议。

于 2010-09-18T14:47:09.917 回答