一个奇怪的UnknownHostException

时间:2013-08-05 11:25:02

标签: java dns ipv6

在网络项目中 我看到了日志:

hadoop.hbase.zookeeper.ZKConfig - java.net.UnknownHostException: example.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)

但是当我 ping example.com 时,没关系,我也 telnet example.com 2181 成功了! 我找到了similar question 所以我在我的服务器 java DomainResolutionTest example.com 中运行DomainResolutionTest
但没关系!

ENV:

java -version

java版“1.6.0_25”
Java(TM)SE运行时环境(版本1.6.0_25-b06)
Java HotSpot(TM)64位服务器VM(版本20.0-b11,混合模式)

os:Red Hat Enterprise Linux Server release 5.7

我很好奇为什么是Inet6AddressImpl,我认为它可能是Inet4AddressImpl

如何解决?
是什么原因?

3 个答案:

答案 0 :(得分:4)

如果是双栈(ipv6 + v4),则Java更喜欢ipv6。

如果您的ipv6以某种方式配置错误,您可以强制它更喜欢ipv4。

使用以下命令设置系统属性: -Djava.net.preferIPv4Stack =真

soure:http://docs.oracle.com/javase/6/docs/technotes/guides/net/ipv6_guide/

答案 1 :(得分:4)

我遇到了同样的异常,并通过在/ etc / hosts中手动设置我的主机名来解决这个问题,以解决' localhost'进入两者。

127.0.0.1       localhost DL006285-linux

# special IPv6 addresses
::1             localhost ipv6-localhost ipv6-loopback DL006285-linux

答案 2 :(得分:1)

向程序提供子网值可能存在问题。 我在传递给程序之前通过修剪它来给出了子网值。

subnet = subnet.trim();
int timeout = 1500;
for(int i=1;i<254;i++)
        {
        try
          {
            String host = subnet +"."+i;
            if (InetAddress.getByName(host).isReachable(timeout))
              {
                Check = Check+host+"\n";
                System.out.println(host);
              } 

           }
        catch (UnknownHostException ex) { 
            Logger.getLogger(WiFi.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(WiFi.class.getName()).log(Level.SEVERE, null, ex);