2

SOCKSプロキシを介してHtmlUnitを使用することは可能ですか?誰かがコードサンプルを提供してもらえますか?

====

だから私はウェブクライアントのソースを掘り下げました、これが私が考えることができる最良の方法です:

  1. SOCKS情報を設定できるようにサブクラス化MultiThreadedHttpConnectionManagerし、設定されている場合は、接続を返す前にSOCKSパラメーターを設定します。

  2. サブクラスWebConnection-ステップ1のマネージャーを使用するように書き直しcreateHttpClient、そのマネージャーを直接または最初にhttpクライアントに取得するメソッドを追加します(現在は保護されています-とても悪いです...)

  3. 使用するには1)WebClientインスタンスを作成します2)サブクラスを作成しますWebConnection3)使用するように設定しますWebClient4)接続のマネージャーにアクセスし、そのメソッドを使用して靴下を使用します

4

2 に答える 2

2

オブジェクトを作成する前に、適切なシステムプロパティを設定するだけです。WebClient例えば:

System.setProperty("socksProxyHost", "localhost"); // replace "localhost" with your proxy server
System.setProperty("socksProxyPort", "9999"); // replace "9999" with your proxy port number

WebClient client = new WebClient();

この時点で、HttpClient(HtmlUnitによって内部で使用されます)が設定を取得し、すべてのネットワーク通信にSOCKSプロキシを使用します。

更新:私はあなたの改訂された質問(およびあなたのコメント)を読みました、そして私はあなたが正しい軌道に乗っていると思います。問題は、上記のシステムプロパティを使用してステップ1を実装すると、コードがスレッドセーフではなくなることです(これらのシステムプロパティはグローバルであるため)。1つの解決策は何かを同期することですが、もちろんこれはパフォーマンスの問題を引き起こす可能性があります(あなたにとっては問題ではないかもしれません)。

本当にこれをソケットごとに制御したい場合は、次のようなことを行う必要があると思います。

  1. オブジェクトをコンストラクターにProtocolSocketFactory渡すカスタムを作成します(この例のように)。java.net.ProxySocket
  2. Protocolこれを使用するカスタムを作成しますProtocolSocketFactory
  3. Protocolを使用して、カスタム接続マネージャーの新しい接続にこれを適用しますHttpConnection.setProtocol()

私は実際にこれをテストしていませんが、HttpClient 3.1のソースコードを一目見ただけで、それが行われると思います。最終的にこの問題をどのように解決するか聞いてみたいです:-)。幸運を!

于 2010-03-19T06:17:10.140 に答える
0

HtmlUnitは、基盤となる接続ライブラリとしてHttpClientを使用します。これについて少し調べましたが、次のようになります。

1- Couldn't find a way to configure HttpClient (except by the generic Java Socks mechanism defined in http://java.sun.com/javase/6/docs/technotes/guides/net/proxies.html)
2- Do not have access to a public Socks Proxy to test against
于 2010-03-09T03:28:30.513 に答える