所有你需要做的在創建WebClient
對象之前設置爲appropriate system properties。例如:
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,則代碼不是線程安全的(因爲這些系統屬性是全局的)。一種解決方案是同步某些東西,但當然這可能會引入性能問題(可能對您無關緊要)。
如果你真的希望在每個套接字來控制這一點,那麼我想你需要做類似如下:
- 創建傳遞一個
java.net.Proxy
對象到自定義ProtocolSocketFactory
Socket
構造函數(如this example)。
- 創建一個使用此
ProtocolSocketFactory
的自定義Protocol
。
- 使用
HttpConnection.setProtocol()
將此Protocol
應用於自定義連接管理器中的新連接。
我沒有真正測試過這個,但是基於對HttpClient 3.1源代碼的快速瀏覽,我認爲這就是如何實現的。我很想聽聽你如何最終解決這個問題:-)。祝你好運!
你是如何最終解決了針對不同webclient實例的不同socks代理的問題? – 2012-04-14 00:39:34
@XCoder,我沒有必要從htmlunit 2開始。8出來,它的配置自該版本 – Fluffy 2012-04-14 09:33:56
是!我也發現它,謝謝你的及時回覆。 – 2012-04-14 22:48:18