【问题标题】:Each thread using its own proxy每个线程使用自己的代理
【发布时间】:2013-05-05 19:10:02
【问题描述】:

我正在尝试设置一个 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

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

【问题讨论】:

    标签: java http networking https proxy


    【解决方案1】:

    也许使用 Proxy 类,如第 3 节中的 here 所述:

    正如我们所见,系统属性很强大,但并不灵活。 “全有或全无”的行为被公正地认为过于严重 大多数开发人员的限制。这就是为什么决定引入 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;
        }       
    }
    

    【讨论】:

    • 再过几个小时我就可以尝试了
    • 赞成您的回答,但接受了我自己的回答。我的解决方案仍然存在一些问题。
    【解决方案2】:

    Barry NL 的解决方案半途而废,因为我不知道如何在该解决方案中不使用代理。

    我想出了什么:

    proxyUrlproxyPort 在我的类的构造函数中。

    如果我只设置proxy = null,我就无法调用url.openConnection(proxy);

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

    【讨论】:

    • 我已经更新了我的答案,并为您更新的问题提供了解决方案。我认为这是官方的做法,并且代码更简洁(ifs 更少)。
    • 我用 DIRECT 试过了,不知道有 NO_PROXY 。稍后我会测试它,看起来不错。我接受了你的回答。
    猜你喜欢
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多