【问题标题】:InetAddress.getByName fails behind proxyInetAddress.getByName 在代理后面失败
【发布时间】:2011-10-18 04:51:57
【问题描述】:

我正在尝试将主机名解析为其对应的 IP。

我的环境是代理服务器后面的公司网络中的 mac,通过系统首选项(自动代理配置)配置了 .pac 文件。到目前为止,一切正常,我可以访问公司网络内外的资源。

在我的网络中解析主机工作得很好: InetAddress.getByName("host.local");

但是当我使用外部主机名时,我得到一个 UnknownHostException: InetAddress.getByName("google.com");

生产

Exception in thread "main" java.net.UnknownHostException: google.com
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:850)
    at java.net.InetAddress.getAddressFromNameService(InetAddress.java:1201)
    at java.net.InetAddress.getAllByName0(InetAddress.java:1154)
    at java.net.InetAddress.getAllByName(InetAddress.java:1084)
    at java.net.InetAddress.getAllByName(InetAddress.java:1020)
    at java.net.InetAddress.getByName(InetAddress.java:970)
    at Test.main(Test.java:67)

(我对这里的Inet6AddressImpl 有点惊讶)

据我了解,InetAddress.getByName 使用本机机制来解析主机名。所以我不认为错误是由于java jvm中缺少代理配置引起的。

但如果一切正常,还能是什么呢?

一些(可能)有用的附加信息:

  • 我使用的是 MacBook,ifconfig 显示接口 lo0、gif0、stf0、en0、fw0、en1 -> 已连接到网络,地址为 ipv4。

  • 控制台上的nslookup google.com返回** server can't find google.com: NXDOMAIN

  • 网络中一台windows机器上的相同代码产生相同的异常

关于这个错误的原因有什么想法吗? 或者还有其他方法可以解析java中的主机名吗?

【问题讨论】:

    标签: java proxy hostname resolve


    【解决方案1】:

    您的公司 DNS 服务器阻止您解析任何 Internet 域(他们可能不希望人们浏览非公司上下文)。

    nslookup 查询失败的事实支持了这一点。

    如果您对公司政策没有投票权,并且您的开发机器必须留在公司场所,那么您无能为力。

    【讨论】:

    • 感谢亚历山大的回答。我不是网络专家,但这是否意味着我无法从公司网络中访问 google.com(当然还有这个站点;)?我知道 pac 文件定义了何时使用代理以及何时不使用代理的规则。也许是与“执行”来自 jvm 的请求的 pac 相关的问题?
    • 亚历山大是正确的。您的流量通过发送到代理到达 Google,该代理会在将流量发送到 Google 网络服务器之前自行进行 DNS 查找。
    • @Benjamin。如果您可以通过公司浏览器访问google.com,那么您可能需要为您的 java 程序配置代理。如需帮助,请阅读本文:download.oracle.com/javase/6/docs/technotes/guides/net/…
    • 好的,现在对我来说很有意义。谢谢你们!
    【解决方案2】:

    this post 中所述,您可以通过仅限 Sun-JVM 的设置来设置自定义 DNS。我遇到了同样的解决问题,但能够通过将代理也设置为 DNS 服务器来明确要求代理进行查找。 YMMV

    System.setProperty("sun.net.spi.nameservice.nameservers", "<my-proxy-ip>");
    System.setProperty("sun.net.spi.nameservice.provider.1", "dns,sun");
    

    【讨论】:

      【解决方案3】:

      我知道这个问题已经更新,但因为它是 Google 中排名靠前的结果,所以我想添加这条有用的信息,它可能会让人绊倒。

      使用此方法时,请记住以下几点。

      http://www.google.com -- DOES NOT WORK
      google.com -- WORKS!
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-11
        • 2014-04-26
        • 1970-01-01
        • 1970-01-01
        • 2012-07-31
        • 1970-01-01
        相关资源
        最近更新 更多