我正在尝试建立一个Java程序,每个线程都可以使用自己的代理。
现在我只找到了一种全局设置代理的方法。 (http://docs.oracle.com/javase/6/docs/technotes/guides/net/proxies.html)
如前所述,这些设置会影响所有http连接 在使用这些选项调用的VM的整个生命周期中。 但是,使用System.setProperty()方法可以实现 一种稍微有点动态的行为。
以下是一段代码摘录,展示了如何做到这一点:
//将http代理设置为webcache.mydomain.com:8080
System.setProperty(“http.proxyHost”,“webcache.mydomain.com”); System.setPropery(“http.proxyPort”,“8080”);
我尝试使用代理类,但是当我不想使用代理时,无法创建直接连接:
private void setProxy()
{
if(proxyUrl != null)
{
SocketAddress addr = new InetSocketAddress(proxyUrl, proxyPort);
proxy = new Proxy(Proxy.Type.HTTP, addr);
}
else
{
proxy = new Proxy(Proxy.Type.DIRECT, null);
}
}
Exception in .... java.lang.IllegalArgumentException: type DIRECT is not compatible with address null
如何才能使其适用于直接连接?尚未尝试代理。
答案 0 :(得分:6)
正如我们所看到的,系统属性功能强大,但不灵活。 “全有或全无”的行为被认为太严重了 大多数开发人员限制。这就是它决定引入的原因 J2SE 5.0中一个新的,更灵活的API,以便它可以实现 有基于连接的代理设置。
您可以使用Proxy.NO_PROXY:
......不要使用任何代理。
做这样的事情:
private void setProxy()
{
if(proxyUrl != null)
{
SocketAddress addr = new InetSocketAddress(proxyUrl, proxyPort);
proxy = new Proxy(Proxy.Type.HTTP, addr);
}
else
{
proxy = Proxy.NO_PROXY;
}
}
答案 1 :(得分:0)
Barry NL的解决方案半工作,因为我无法弄清楚如何不使用该解决方案的代理。
我想出了什么:
proxyUrl
和proxyPort
位于我班级的构造函数中。
如果我刚设置url.openConnection(proxy);
proxy = null
或proxy = new Proxy(Proxy.Type.DIRECT, null);
。
所以我写了自己的openConnection
private void setProxy()
{
if(proxyUrl != null)
{
SocketAddress addr = new InetSocketAddress(proxyUrl, proxyPort);
proxy = new Proxy(Proxy.Type.HTTP, addr);
}
else
{
proxy = null;
}
}
private URLConnection openConnection2(URL url)
{
try {
if(proxy != null)
return url.openConnection(proxy);
else
return url.openConnection();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
setProxy()
必须在进行任何连接之前调用。
我也替换了
url = new URL(http_url);
con = (HttpURLConnection)url.openConnection(proxy);
与
url = new URL(http_url);
con = (HttpURLConnection)openConnection2(url);