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は言います:

これは、ファイアウォールの背後にいる人々が私のアプリを使用できるようにするためであり、唯一の方法はWebプロキシです。プロキシに接続することにより、データをHTTPSとしてターゲットサーバーに転送し、ターゲットサーバーへの安全な接続を提供します。

Webプロキシ、プロトコル対応ファイアウォールなどを介してプロトコルを正常にトンネリングする場合は、アプリケーションのクライアント側とサーバー側がHTTPプロトコル仕様に準拠している必要があります。(どういうわけか)ソケットレベルにドリルダウンできた場合、プロトコルに違反する可能性があります...

代わりに、HTTPリクエストとレスポンスのコンテンツにデータを配置し、メッセージ/レスポンスのカスタムHTTPヘッダー、カスタムコンテンツタイプなどを使用して、カスタムプロトコルを実装する必要があります。

于 2010-09-18T14:47:09.917 に答える