Java 每个线程使用自己的代理

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

我正在尝试设置一个Java程序,其中每个线程都可以使用自己的代理

现在我只找到了一种全局设置代理的方法。()

如前所述,这些设置会影响所有http连接 在使用这些选项调用的VM的整个生命周期内。 但是,可以使用System.setProperty()方法 稍微有点动态的行为

下面是一段代码摘录,展示了如何做到这一点:

//将http代理设置为webcache.mydomain.com:8080

setProperty(“http.proxyHost”、“webcache.mydomain.com”); System.setProperty(“http.proxyPort”、“8080”)

更新 我尝试使用proxy类,但当我不想使用所述代理时,无法创建直接连接:

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);