如何将 SOCKS 与 HtmlUnit 一起使用?
Posted
技术标签:
【中文标题】如何将 SOCKS 与 HtmlUnit 一起使用?【英文标题】:How can I use SOCKS with HtmlUnit? 【发布时间】:2010-03-08 22:55:11 【问题描述】:是否可以通过 SOCKS 代理使用 htmlUnit?谁能提供代码示例?
====
所以我已经挖掘了 webclient 资源,这是我能想到的最好的方法:
子类 MultiThreadedHttpConnectionManager
以便它允许设置 SOCKS 信息,如果已设置,则在返回连接之前设置 SOCKS 参数
子类 WebConnection
- 重写 createHttpClient
以便它使用第 1 步中的管理器并添加一个方法来直接获取该管理器或首先获取 http 客户端(它现在是受保护的 - 太糟糕了...)
要使用 1) 创建一个WebClient
实例 2) 创建子类WebConnection
3) 将其设置为由WebClient
使用 4) 访问连接的管理器并使用它的方法来使用socks
【问题讨论】:
您是如何最终解决为不同的 webclient 实例使用不同的 socks 代理的问题的? @XCoder,自从 htmlunit 2.8 出来后我就不必这样做了,而且从那个版本开始就可以配置了 是的!我也找到了,谢谢及时回复。 【参考方案1】:您需要做的就是在创建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)。
创建一个使用此ProtocolSocketFactory
的自定义Protocol
。
使用 HttpConnection.setProtocol()
将此 Protocol
应用于自定义连接管理器中的新连接。
我还没有实际测试过这个,但是基于对 HttpClient 3.1 源代码的快速浏览,我认为这就是它的完成方式。我很想听听你最终如何解决这个问题:-)。祝你好运!
【讨论】:
这样我将为所有 WebClient 实例设置 SOCKS 属性。我希望能够为不同的实例设置不同的代理服务器【参考方案2】: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
【讨论】:
在 2.8 中工作,因为 httpclient 较新。你是开发者之一,对吧?感谢您的工作。 是的,我是团队中的一员。 2.8 支持 SOCKS,即使在请求级别,享受 :)以上是关于如何将 SOCKS 与 HtmlUnit 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 socks 配置 Android SDK 管理器?