如何使用java.net.URL/URLConnection配合代理链

3

我想使用Java通过一系列代理服务器(不止一个)来加载网站。每个请求都应该能够使用另一个代理链。这是我的第一个简单粗暴的尝试:

// My proxies and there ports marked with pIP1 pPort1, pIP2 pPort2...
Socket socket = new Socket(pIP1, pPort1);
OutputStream out = socket.getOutputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String connectOverProxy1ToProxy2 = "CONNECT " + pIP2 + ":" + pPort2 + " HTTP/1.1\n\n";
String connectHost = "GET http://stackoverflow.com/ HTTP/1.1\n\n";

out.write((connectOverProxy1ToProxy2 + connectHost).getBytes());
out.flush();

String inputLine;
while ((inputLine = in.readLine()) != null)
  System.out.println(inputLine);

out.close();
in.close();

作为回答,我收到了这个:
HTTP/1.0 200 Connection established
Proxy-agent: tinyproxy/1.8.3

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Cache-Control: public, max-age=30
Expires: Mon, 08 Apr 2013 11:42:08 GMT
X-Frame-Options: SAMEORIGIN
Date: Mon, 08 Apr 2013 11:41:36 GMT
Last-Modified: Mon, 08 Apr 2013 11:41:08 GMT
Vary: *
Content-Length: 182825

<!DOCTYPE html>
<html>
[..]
</html>

让我们来看看这个问题。 现在我尝试使用URL/URLConnection加载页面,以便使用Java包的全部处理和功能。是否有一种方式可以使用代理链而不是单个代理来使用URL/URLConnection?

感谢您的帮助...


HttpUrlConnection类通过使用代理相关的系统设置来支持代理。我认为,无论是一个代理还是多个代理,只要您成功配置第一个代理,就不会有问题。 - mthmulders
好的,那应该可以工作了,但我需要为每个请求构建一个新的链,并且允许多个请求并行。我已经修复了问题。感谢您的回复。 - Sebastian
1个回答

0

HttpUrlConnection类支持使用代理相关的系统设置来代理。

但是,您可以通过调用ProxySelector.setDefault()并提供自己的ProxySelector子类来更改默认的代理选择机制。

通过重写select(URL)方法,您可以为该URL返回所需的代理。我建议首先尝试仅返回链中的“第一个”代理,并查看HttpUrlConnection是否会自动通过代理链。


如果我理解正确,ProxySelectorClass保存了一组代理,并通过执行“select(URI uri)”返回其子列表,但是如何使用这种方式构建和使用代理链呢? - Sebastian
设置一个固定的代理链并不是解决我的问题的方法。我无法访问代理设置。假设所有我的代理都是外国开放代理。我必须在请求本身(或客户端机器上)构建完整的代理链。希望我正确理解了你的建议。 - Sebastian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接