为什么ProxySelector在Java中返回不一致的结果?

时间:2013-01-03 14:41:20

标签: java networking proxy proxyselector

8个月前,我使用此stack overflow post在Java项目中自动使用代理服务器。它运作得很漂亮。

以下是我当时提出的代码:

    System.setProperty("java.net.useSystemProxies", "true");

    List<Proxy> proxyServers = null;
    try {
        proxyServers = ProxySelector.getDefault().select(new URI("http://www.twitter.com"));
    } catch (URISyntaxException e) {
      System.out.println("Error using system proxy");
    }
    if (proxyServers != null) {
        for (Iterator<Proxy> iter = proxyServers.iterator(); iter.hasNext();) {
            Proxy proxy = iter.next();
            System.out.println("Found Proxy: " + proxy);
            InetSocketAddress addr = (InetSocketAddress) proxy.address();

            if (addr == null) {
              System.out.println("No Proxy");
            } else {

                System.setProperty("http.proxyHost", addr.getHostName());
                System.setProperty("http.proxyPort", Integer.toString(addr.getPort()));

                System.out.println("proxy hostname : " + addr.getHostName());
                System.out.println("proxy port : " + addr.getPort());

            }
        }
    }

我最近尝试将这个完全相同的代码添加到另一个项目中,并得到了不同的结果。我的计算机设置使用测试代理服务器并运行两个项目来比较结果。如果我从8个月前开始运行该项目,则打印出以下内容:

Found Proxy: HTTP @ 192.168.1.100:8000
proxy hostname : 192.168.1.100
proxy port : 8000

如果我在设置了相同代理服务器的同一台机器上运行当前项目,则打印出以下内容。

Found Proxy: DIRECT 
No Proxy

找到的唯一代理是“Direct”,proxy.address()为null。

什么会导致在一种情况下找到代理设置而不是另一种呢?

修改

我通过在启动过程中更快地移动代码来解决这个问题,但我不知道为什么要修复它。

2 个答案:

答案 0 :(得分:2)

可能是由http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html#Proxies

中的这句话引起的
  

java.net.useSystemProxies(默认值:false)在最近的Windows系统上   在Gnome 2.x系统上,可以告诉java.net堆栈,   将此属性设置为true,以使用系统代理设置   (这两个系统都允许您通过用户全局设置代理   接口)。 请注意,此属性仅在启动时检查一次。

如果将属性放在java命令中,则可以保证它正常工作:java -Djava.net.useSystemProxies=true yourclass

此致

答案 1 :(得分:0)

如果将代码与安全页面一起使用,它将不考虑代理,因此将显示“直接”和“不代理”。

尝试以下代码:

proxyServers = ProxySelector.getDefault().select(new URI("http://www.twitter.com"));
proxyServers = ProxySelector.getDefault().select(new URI("https://www.twitter.com"));

您会有所不同。