是否可以通过SOCKS代理使用HtmlUnit?有人可以提供代码示例吗?
====
所以我通过webclient来源挖掘,这是我能想到的最佳方式:
子类MultiThreadedHttpConnectionManager
,以便它允许设置SOCKS信息,如果设置了SOCKS信息,则在返回连接之前,设置SOCKS参数
子类WebConnection
- 重写createHttpClient
以便它使用第1步中的管理器并添加一个方法直接获取该管理器或者首先获取http客户端(它是 protected < / em>现在 - 太糟糕了......)
使用1)创建WebClient
实例2)创建子类WebConnection
3)将其设置为WebClient
使用4)访问连接的管理器并使用它的方法使用袜子
答案 0 :(得分: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,那么您的代码不是线程安全的(因为这些系统属性是全局的)。一种解决方案是同步某些东西,但当然这会引入性能问题(对您来说可能无关紧要)。
如果真的希望在每个插槽的基础上控制它,那么我认为您需要执行以下操作:
ProtocolSocketFactory
,将java.net.Proxy
对象传递给Socket
构造函数(如this example中所示)。Protocol
。ProtocolSocketFactory
Protocol
将此HttpConnection.setProtocol()
应用于自定义连接管理器中的新连接。我实际上没有对此进行测试,但基于对HttpClient 3.1源代码的快速浏览,我认为这是如何完成的。我很想知道你最终如何解决这个问题:-)。祝你好运!
答案 1 :(得分: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