InetAddress.getHostAddress() 是否符合ipv6标准?

7

JDK 1.6 中的 InetAddress.getHostAddress() 是否兼容 IPv6?

具体来说,我正在进行以下操作。

InetAddress.getLocalHost().getHostAddress()

它是否符合IPv6标准?它是否适用于IPv4和v6地址?


1
最终结论是它确实符合IPv6标准。 - Fakrudeen
请您批准我的编辑 - 然后我会接受答案。目前,人们不确定答案是肯定还是否定。 - Fakrudeen
我不能这样做。社区已经拒绝了它,而且他们有充分的理由来拒绝它。 - Buhake Sindi
请注意,此问题不涉及Inet6Address,而是涉及接口InetAddress。 - Fakrudeen
Inet6AddressInetAddress的子类。InetAddress是一个工厂模式,返回IPvX实现。你的陈述没有意义,因为InetAddress使用Inet6Address。至于有效的原因,你的编辑不能被证明是合理的,因为提供的答案已足以回答你的问题。额外的编辑也无法被证明是合理的。 - Buhake Sindi
3个回答

7

扩展类java.net.Inet6Address符合IPv6标准。

JavaDoc:

该类表示Internet协议版本6(IPv6)地址。由RFC 2373定义:IP版本6寻址架构。

基本上,如果您使用InetAddress.getByName()InetAddress.getByAddress()方法,这些方法会识别名称或地址是IPv4还是IPv6名称/地址,并分别返回扩展的Inet4Address/Inet6Address

至于InetAddress.getHostAddress(),它返回null。您需要使用java.net.Inet6Address.getHostAddress()来返回可表示IPv6字符串的地址。


谢谢 - InetAddress.getLocalHost().getHostAddress() 安全吗?请看一下我的编辑。 - Fakrudeen
@Fakrudeen,我猜你需要做一个 if (InetAddress.getLocalHost() instanceof Inet6Address) 来判断它是不是返回了一个 Inet6Address,或者阅读 InetAddress 的源代码。 - Buhake Sindi
@Elite,我看了源代码。根据是否支持IPv6,它似乎正在做正确的事情。但我只是想和社区确认一下。InetAddress的静态块: 如果(isIPv6Supported()) { o = InetAddress.loadImpl("Inet6AddressImpl"); } else { o = InetAddress.loadImpl("Inet4AddressImpl"); } return (InetAddressImpl)o; - Fakrudeen
@Fakrudeen,这就是你要的! :-) 做研究时做得很好。 - Buhake Sindi

4

我查看了InetAddress类的代码,它确实做了正确的事情。

  if (isIPv6Supported()) { 
      o = InetAddress.loadImpl("Inet6AddressImpl"); 
  } 
  else { 
      o = InetAddress.loadImpl("Inet4AddressImpl"); } 
      return (InetAddressImpl)o; 
  }

3
以下是基于以上分析的测试代码:

这里是测试代码:

public static void main(String[] args) {
    // TODO Auto-generated method stub
    InetAddress localIP;
    try {
        localIP = InetAddress.getLocalHost();
         if(localIP instanceof Inet6Address){
             System.out.println("IPV6");
         } else if (localIP instanceof Inet4Address) {
             System.out.println("IPV4");
         }
    } catch (UnknownHostException e) {
        e.printStackTrace();
    }

}

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