在代理后使用InetAddress.getByName失败

5
我正在尝试将主机名解析为相应的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中主机名的方法吗?

3个回答

5

您的企业DNS服务器阻止您解析任何互联网域名(他们可能不希望人们浏览非企业上下文)。

这一事实也得到了您的nslookup查询失败的支持。

如果您在企业政策上没有发言权,并且您的开发机器必须留在公司内部,则无法做任何事情。


谢谢你的回答,亚历山大。我不是网络专家,但这是否意味着我无法从公司网络内访问google.com(当然还有这个网站 ;))?我知道pac文件定义了何时使用代理和何时不使用的规则。也许与从jvm请求时执行pac相关的问题? - Benjamin
1
亚历山大是正确的。您的流量通过发送到代理来到达Google,代理在将流量发送到Google Web服务器之前自行执行DNS查找。 - EricLaw
@Benjamin。如果您可以通过公司浏览器访问google.com,那么您可能需要为您的Java程序配置代理。如需帮助,请阅读此文章:http://download.oracle.com/javase/6/docs/technotes/guides/net/proxies.html。 - Alexander Pogrebnyak
好的,现在我明白了。谢谢你们两个! - Benjamin

0

我知道这个问题已经有更新了,但因为它是谷歌搜索结果中排名最靠前的,我想添加一些可能会让人们困扰的有用信息。

在使用这种方法时,请记住以下内容。

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

0

此篇文章所述,您可以通过Sun-JVM的特定设置来设置自定义DNS。我曾经遇到过同样的解析问题,但是通过将代理设置为DNS服务器并显式地请求查找,我成功解决了这个问题。具体情况可能因人而异。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接