Java 每个线程使用自己的代理
我正在尝试设置一个Java程序,其中每个线程都可以使用自己的代理 现在我只找到了一种全局设置代理的方法。() 如前所述,这些设置会影响所有http连接 在使用这些选项调用的VM的整个生命周期内。 但是,可以使用System.setProperty()方法 稍微有点动态的行为 下面是一段代码摘录,展示了如何做到这一点: //将http代理设置为webcache.mydomain.com:8080 setProperty(“http.proxyHost”、“webcache.mydomain.com”); System.setProperty(“http.proxyPort”、“8080”) 更新 我尝试使用proxy类,但当我不想使用所述代理时,无法创建直接连接:Java 每个线程使用自己的代理,java,http,networking,https,proxy,Java,Http,Networking,Https,Proxy,我正在尝试设置一个Java程序,其中每个线程都可以使用自己的代理 现在我只找到了一种全局设置代理的方法。() 如前所述,这些设置会影响所有http连接 在使用这些选项调用的VM的整个生命周期内。 但是,可以使用System.setProperty()方法 稍微有点动态的行为 下面是一段代码摘录,展示了如何做到这一点: //将http代理设置为webcache.mydomain.com:8080 setProperty(“http.proxyHost”、“webcache.mydomain.com
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);
}
}
中的异常。。。。java.lang.IllegalArgumentException:类型DIRECT与地址null不兼容
我怎样才能让这个直接连接工作?尚未尝试代理。可能会使用第3节中解释的类:
正如我们所看到的,系统属性功能强大,但不灵活。
“要么全有,要么全无”的行为被公正地认为是太严重的错误
大多数开发人员的限制。这就是为什么决定引入
J2SE5.0中的一个新的、更灵活的API,以便
具有基于连接的代理设置
您可以使用:
。。。不使用任何代理
这样做:
private void setProxy()
{
if(proxyUrl != null)
{
SocketAddress addr = new InetSocketAddress(proxyUrl, proxyPort);
proxy = new Proxy(Proxy.Type.HTTP, addr);
}
else
{
proxy = Proxy.NO_PROXY;
}
}
Barry NL的解决方案是半有效的,因为我不知道如何在该解决方案中不使用代理 我想到的是:
proxyUrl
和proxyPort
在我的类的构造函数中
我无法调用url.openConnection(proxy)代码>如果我刚刚设置了proxy=null
或proxy=新代理(proxy.Type.DIRECT,空)代码>。
所以我写了自己的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);
与
再过几个小时,我就可以试一下了。我对你的答案投了赞成票,但接受了我自己的答案。我对您的解决方案仍有一些问题。我已用您更新的问题的解决方案更新了我的答案。我认为这是一种官方的方式,可以产生更干净的代码(更少的ifs)。我用DIRECT试过,不知道有一个NO_代理。我稍后会测试,看起来不错。我接受了你的回答。
url = new URL(http_url);
con = (HttpURLConnection)openConnection2(url);