2

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

====

所以我已经挖掘了 webclient 资源,这是我能想到的最好的方法:

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

  2. 子类WebConnection- 重写createHttpClient以便它使用步骤 1 中的管理器并添加一个方法来直接获取该管理器或首先获取 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. 创建一个将对象ProtocolSocketFactory传递给构造函数的自定义(如本例所示)。java.net.ProxySocket
  2. 创建一个Protocol使用 this的自定义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 回答