2013-01-14 79 views
7

Java 7中增加了一个新的静态方法的类java.net.InetAddress静态InetAddress.getLoopbackAddress()返回什么?

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对象表示?

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

回答

4

首先是.getLocalHost(),该方法的根本区别:.getLocalHost()将获得与机器名注册的地址,而.getLoopbackAddress()将返回仅本地,环回地址。

至于返回的地址,它取决于操作系统。但是,你可以,或使用影响通过传递-Djava.net.preferIPv4Stack=true到JVM参数为使用IPv4优先的JVM:

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

如果你有一个IPv6协议栈和Java没有配置为首选IPv4,它会返回:: 1。

否则它将返回127.0.0.1。

+0

不确定这是否正确。至少在Java 7中,默认设置是首选IPv6 ** stack **,但是更喜欢IPv4 **地址**(注意不同之处)。这意味着'InetAddress.getLoopbackAddress()'会在大多数现代操作系统中默认返回一个IPv4地址。有[两个不同的属性](http://docs.oracle.com/javase/7/docs/technotes/guides/net/ipv6_guide/#ipv6-networking)来控制这一点。 – peterh

+0

我非常肯定EJP是完全正确的,他只是在他的回答中“IPv4”后面隐藏了隐含的“地址”。如果存在IPv6堆栈(如果您阅读链接,在将首选堆栈设置为IPv4时将*删除*属性,但IPv4地址不是首选),则IPv6地址将默认为。 – codetaku

6

我相信这里给出的其他答案是错误的。

Java中,默认情况下,喜欢IPv6协议栈(如果有的话),但喜欢IPv4地址。请注意细微差别。这由系统属性java.net.preferIPv4Stackjava.net.preferIPv6Addresses控制,它们都默认为false。

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

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

+0

你确定_preferIPv6Addresses = false_自动暗示它更喜欢IPv4地址吗?这可能意味着它没有任何特别的偏好。 – magnattic

+0

@atticae。通过JDK源代码加上自己做了一个测试。所以,是的,我确定。我只能说'java.net.preferIPv6Addresses'是如何应用于'InetAddress.getLoopbackAddress()'方法的结果的,因为它只是针对我已经深入到源代码中的这种方法。 – peterh