2010-03-08 78 views
2

是否可以通過SOCKS代理使用HtmlUnit?任何人都可以提供一個代碼示例嗎?如何在HtmlUnit中使用SOCKS?

====

所以我已經通過Web客戶端源挖,這裏是我能想到的最好的辦法:

  1. 子類MultiThreadedHttpConnectionManager,以便它允許設置SOCKS信息,如果它是集,並返回一個連接之前,套SOCKS參數

  2. 子類WebConnection - 重寫createHttpClient以便它使用一管理器從步驟1和添加的方法,以直接或HTTP CLIEN獲取管理器T取代第一(這是保護現在 - 如此糟糕...)

  3. 要使用1)創建WebClient實例2)創建子類WebConnection 3)將其設置爲通過WebClient 4)接入連接的管理使用,使用它的方法來使用socks

+0

你是如何最終解決了針對不同webclient實例的不同socks代理的問題? – 2012-04-14 00:39:34

+0

@XCoder,我沒有必要從htmlunit 2開始。8出來,它的配置自該版本 – Fluffy 2012-04-14 09:33:56

+0

是!我也發現它,謝謝你的及時回覆。 – 2012-04-14 22:48:18

回答

0

使用的HtmlUnit的HttpClient作爲底層連接庫,我調查了這一點,但:

​​
+0

由於較新的httpclient而在2.8中工作。你是開發人員之一,對吧?感謝您的工作。 – Fluffy 2010-09-14 16:27:30

+0

是的,我是團隊中的一員。 2.8支持SOCKS,即使在請求級別,也可以享受:) – 2010-09-25 07:45:39

2

所有你需要做的在創建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,則代碼不是線程安全的(因爲這些系統屬性是全局的)。一種解決方案是同步某些東西,但當然這可能會引入性能問題(可能對您無關緊要)。

如果你真的希望在每個套接字來控制這一點,那麼我想你需要做類似如下:

  1. 創建傳遞一個java.net.Proxy對象到自定義ProtocolSocketFactorySocket構造函數(如this example)。
  2. 創建一個使用此ProtocolSocketFactory的自定義Protocol
  3. 使用HttpConnection.setProtocol()將此Protocol應用於自定義連接管理器中的新連接。

我沒有真正測試過這個,但是基於對HttpClient 3.1源代碼的快速瀏覽,我認爲這就是如何實現的。我很想聽聽你如何最終解決這個問題:-)。祝你好運!

+0

這樣我就可以爲所有WebClient實例設置SOCKS屬性。我希望能夠爲不同的實例設置不同的代理服務器 – Fluffy 2010-03-19 12:27:06