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

时间:2013-05-05 19:10:02

标签: java http networking https proxy

我正在尝试建立一个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

如何才能使其适用于直接连接?尚未尝试代理。

2 个答案:

答案 0 :(得分:6)

可能会使用第3节中解释为Proxyhere类:

  

正如我们所看到的,系统属性功能强大,但不灵活。   “全有或全无”的行为被认为太严重了   大多数开发人员限制。这就是它决定引入的原因   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的解决方案半工作,因为我无法弄清楚如何不使用该解决方案的代理。

我想出了什么:

proxyUrlproxyPort位于我班级的构造函数中。

如果我刚设置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);