如何在HtmlUnit中使用SOCKS?

时间:2010-03-08 22:55:11

标签: java htmlunit socks

是否可以通过SOCKS代理使用HtmlUnit?有人可以提供代码示例吗?

====

所以我通过webclient来源挖掘,这是我能想到的最佳方式:

  1. 子类MultiThreadedHttpConnectionManager,以便它允许设置SOCKS信息,如果设置了SOCKS信息,则在返回连接之前,设置SOCKS参数

  2. 子类WebConnection - 重写createHttpClient以便它使用第1步中的管理器并添加一个方法直接获取该管理器或者首先获取http客户端(它是 protected < / em>现在 - 太糟糕了......)

  3. 使用1)创建WebClient实例2)创建子类WebConnection 3)将其设置为WebClient使用4)访问连接的管理器并使用它的方法使用袜子

2 个答案:

答案 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,那么您的代码不是线程安全的(因为这些系统属性是全局的)。一种解决方案是同步某些东西,但当然这会引入性能问题(对您来说可能无关紧要)。

如果真的希望在每个插槽的基础上控制它,那么我认为您需要执行以下操作:

  1. 创建一个自定义ProtocolSocketFactory,将java.net.Proxy对象传递给Socket构造函数(如this example中所示)。
  2. 创建使用此Protocol
  3. 的自定义ProtocolSocketFactory
  4. 使用Protocol将此HttpConnection.setProtocol()应用于自定义连接管理器中的新连接。
  5. 我实际上没有对此进行测试,但基于对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