【问题标题】:What does the static InetAddress.getLoopbackAddress() return?静态 InetAddress.getLoopbackAddress() 返回什么?
【发布时间】:2013-01-14 00:15:57
【问题描述】:

Java 7 为类 java.net.InetAddress 添加了一个新的静态方法:

static InetAddress getLoopbackAddress()
Returns the loopback address.

现在我想知道结果中会包含什么地址,IP4 还是 IP6。

documentation 在这个问题上有点模糊:

返回的 InetAddress 将表示 IPv4 环回地址 127.0.0.1 或 IPv6 环回地址 ::1。返回的 IPv4 环回地址只是 127...*

形式的众多地址之一

Java 如何决定是返回127.0.0.1 还是返回IPv6 挂件::1

还是它们都由同一个 InetAdress 对象表示?

结果总是一样吗?是否取决于我的网卡?

【问题讨论】:

    标签: java network-programming java-7


    【解决方案1】:

    我认为这里给出的其他答案是错误的。

    Java,默认情况下,首选 IPv6 堆栈(如果可用),但 首选 IPv4 地址。注意细微的差别。这由java.net.preferIPv4Stackjava.net.preferIPv6Addresses 系统属性控制,这两个属性都默认为false。

    因此,InetAddress.getLoopbackAddress() 几乎总是会返回一个 IPv4 地址。您必须将 java.net.preferIPv6Addresses 系统属性设置为 true 才能使其返回 IPv6 地址。

    我在 JDK 源代码中没有看到此方法的结果有任何操作系统依赖性。我想不出Java不会(使用默认设置)为此方法返回IPv4地址的操作系统。

    【讨论】:

    • 您确定 preferIPv6Addresses = false 自动暗示它更喜欢 IPv4 地址吗?这可能只是意味着它没有任何特殊偏好。
    • @atticae。浏览了 JDK 源代码并自己进行了测试。所以,是的,我确定。我只能说 java.net.preferIPv6Addresses 如何适用于 InetAddress.getLoopbackAddress() 方法的结果,因为它仅适用于我已经深入研究源代码的这种方法。
    【解决方案2】:

    首先,.getLocalHost() 和这个方法之间有一个根本的区别:.getLocalHost() 将获得使用 机器名 注册的地址,而 .getLoopbackAddress() 将返回仅限本地的环回地址。

    至于返回的地址,它是依赖于操作系统的。但是,您可以通过将 -Djava.net.preferIPv4Stack=true 传递给 JVM 参数或使用以下方法来影响 JVM 优先使用 IPv4:

    System.setProperty("java.net.preferIPv4Stack" , "true");
    

    【讨论】:

      【解决方案3】:

      如果您有 IPv6 堆栈并且 Java 未配置为首选 IPv4,它将返回 ::1。

      否则会返回 127.0.0.1。

      【讨论】:

      • 不确定这是否正确。至少在 Java 7 中,默认设置是首选 IPv6 stack,但首选 IPv4 addresses(注意区别)。这意味着InetAddress.getLoopbackAddress() 在大多数现代操作系统上默认返回一个 IPv4 地址。有two different properties可以控制这个。
      • 我很确定 EJP 是完全正确的,他只是在回答中省略了“IPv4”之后隐含的“地址”。如果存在 IPv6 堆栈(如果您阅读链接,当您将首选堆栈设置为 IPv4 时,该属性会删除),但 IPv4 地址不是首选,那么 IPv6 地址将默认为。
      猜你喜欢
      • 2012-09-14
      • 2016-09-24
      • 1970-01-01
      • 2015-02-04
      • 2015-03-27
      • 2022-12-18
      • 2017-12-08
      • 1970-01-01
      相关资源
      最近更新 更多