2012-08-15 39 views
4

在Java中有告诉它只返回IPv6的方法吗?我已经尝试了一切,无法让它工作。在Java中返回IPv6

try 
    { 
     InetAddress inet = InetAddress.getByName(hostName); 

     boolean status = inet.isReachable(5000); 

     if (status) 
     { 
      System.out.println(inet.getCanonicalHostName() + " Host Reached\t" + java.net.Inet6Address.getByName(hostName).getHostAddress()); 
     } 
     else 
     { 
      System.out.println(inet.getCanonicalHostName() + " Host Unreachable"); 
     } 

    } 
    catch (UnknownHostException e) 
    { 
     System.err.println("Host does not exists"); 
    } 
    catch (IOException e) 
    { 
     System.err.println("Error in reaching the Host"); 
    } 

我用尽量只返回IPv6的线路:

System.out.println(inet.getCanonicalHostName() + " Host Reached\t" + java.net.Inet6Address.getByName(hostName).getHostAddress()); 

这使返回的IPv4。任何人都知道为什么要这样做?

+0

这就是我正在使用的。 – Nick 2012-08-15 18:02:17

+0

你的机器上是否启用了ipv6? – 2012-08-15 18:11:17

+0

是的。我用C#编写了这个程序,它工作正常,只是无法在java中弄清楚。 – Nick 2012-08-15 18:30:35

回答

2

java.net.Inet6Address不会覆盖getByName()
所以它总是会返回特定的IPv4地址, 除非你的参数本身是一个有效的IPv6地址的形式,在这种情况下,该方法将返回Inet6Address,惟一-对象。

例如:
getByName("stackoverflow.com") - > Inet4Address
getByName("2001:0db8:85a3:08d3:1319:8a2e:0370:7344") - >是Inet6Address

InetAddress.getByName() - 文档

确定主机的IP地址,给定主持人的名字。主机名称可以是机器名称,例如“java.sun.com”,也可以是其IP地址的文本表示。如果提供的文字IP地址是 ,则只检查地址格式的有效性。

>对于文字IPv6地址指定的主机,无论是在 RFC 2732或RFC中定义的2373字面IPv6地址格式中定义的形式是 接受。 <

所以,如果你想获得一个IPv6的地址,你需要你的参数中定义它,或配置DNS服务器来代替返回的IPv4地址的IPv6地址。

检索IPv6地址的另一种方法是使用InetAddress.getAllByName("www.google.at"),它返回主机的所有已知IP地址。

例如,您可以使用此方法返回的数组,返回第一个IPv6地址或null过滤如果主机没有一个:

public Inet6Address getIPv6Addresses(InetAddress[] addresses) { 
    for (InetAddress addr : addresses) { 
     if (addr instanceof Inet6Address) { 
      return (Inet6Address) addr; 
     } 
    } 
    return null; 
} 

UPDATE: 更多功能特别是那些影响DNS服务器的,我建议使用外部库DNSJava,因为DNS支持的普通Java实现很差。
http://www.dnsjava.org/

目前代码:

public class Ping 
{ 
public void pingHost (String hostName) 
{ 
    try 
    { 
     InetAddress[] inet = InetAddress.getAllByName(hostName); 

     String address = this.getIPv4Addresses(inet).getHostAddress(); 

     boolean status = this.getIPv6Addresses(inet).isReachable(5000); 

     if (status) 
     { 

      System.out.println(reverseDns(address) + " Host Reached\t" + this.getIPv6Addresses(inet).getHostAddress()); 
     } 
     else 
     { 
      System.out.println(this.getIPv6Addresses(inet).getCanonicalHostName() + " Host Unreachable"); 
     } 

    } 
    catch (UnknownHostException e) 
    { 
     System.err.println("Host does not exists"); 
    } 
    catch (IOException e) 
    { 
     System.err.println("Error in reaching the Host"); 
    } 
} 

public Inet6Address getIPv6Addresses(InetAddress[] addresses) 
{ 
    for (InetAddress addr : addresses) 
    { 
     if (addr instanceof Inet6Address) 
     { 
      return (Inet6Address) addr; 
     } 
    } 
    return null; 
} 

public Inet4Address getIPv4Addresses(InetAddress[] addresses) 
{ 
    for (InetAddress addr : addresses) 
    { 
     if (addr instanceof Inet4Address) 
     { 
      return (Inet4Address) addr; 
     } 
    } 
    return null; 
} 

public static String reverseDns(String hostIp) throws IOException 
{ 
    Resolver res = new ExtendedResolver(); 

    Name name = ReverseMap.fromAddress(hostIp); 
    int type = Type.PTR; 
    int dclass = DClass.IN; 
    Record rec = Record.newRecord(name, type, dclass); 
    Message query = Message.newQuery(rec); 
    Message response = res.send(query); 

    Record[] answers = response.getSectionArray(Section.ANSWER); 
    if (answers.length == 0) 
     return hostIp; 
    else 
     return answers[0].rdataToString(); 
    } 

} 
+0

对不起,我有点困惑(有点新),所以我无法使用DNS名称返回/显示IPv6?总结一下,有没有办法让我使用DNS名称来返回IPv6地址?谢谢 – Nick 2012-08-15 18:29:40

+0

它取决于使用的DNS服务器,当然也是主机...如果主机没有启用IPv6或DNS只返回IPv4地址,你是运气不好......但你可以给InetAddress.getAllByName( “stackoverflow.com”)尝试..它将返回此域的所有已知IP地址。 – Pr0gr4mm3r 2012-08-15 18:35:39

+0

这些都是启用了IPv6的本地计算机。我有一个我用C#编写的程序,它返回IPv4和IPv6以及完整的DNS名称,但我无法弄清楚如何在Java中执行此操作。 – Nick 2012-08-15 18:41:37