2

8 个月前,我使用这个堆栈溢出帖子在 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

找到的唯一代理是“直接”并且 proxy.address() 为空。

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

编辑:

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

4

2 回答 2

4

可能是由于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

问候

于 2014-10-08T15:20:39.850 回答
0

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

试试下面的代码:

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

你会得到不同的。

于 2020-07-31T09:11:11.850 回答