2

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

现在我只找到了一种全局设置代理的方法。(http://docs.oracle.com/javase/6/docs/technotes/guides/net/proxies.html

如前所述,这些设置会在使用这些选项调用的 VM 的整个生命周期内影响所有 http 连接。但是,使用 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

我怎样才能让它适用于直接连接?还没试过代理。

4

2 回答 2

6

也许使用第 3 节中解释Proxy类:

正如我们所见,系统属性很强大,但并不灵活。大多数开发人员公正地认为“全有或全无”行为是一种过于严格的限制。这就是为什么决定在 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;
    }       
}
于 2013-05-05T19:15:55.047 回答
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);  
于 2013-05-10T11:41:25.747 回答