在java中,InetAddress.getLocalHost() 和 InetAddress.getByName("127.0.0.1") 有啥区别

Posted

技术标签:

【中文标题】在java中,InetAddress.getLocalHost() 和 InetAddress.getByName("127.0.0.1") 有啥区别【英文标题】:In java, what's the difference between InetAddress.getLocalHost() and InetAddress.getByName("127.0.0.1")在java中,InetAddress.getLocalHost() 和 InetAddress.getByName("127.0.0.1") 有什么区别 【发布时间】:2013-12-18 08:33:03 【问题描述】:

我正在使用 Windows 8JDK 1.7。我的IP地址是192.168.1.108,运行时:

System.out.println(InetAddress.getLocalHost().equals(InetAddress.getByName("localhost"))); 

System.out.println(InetAddress.getLocalHost().equals(InetAddress.getByName("127.0.0.1")));

输出 - 都是假的。

InetAddress.getLocalHost() - Output: 192.168.1.108      
InetAddress.getByName("localhost") - Output: 127.0.0.1

此外,我的 UDP 服务器绑定在 InetAddress.getLocalHost() 上,如果客户端将数据包发送到 InetAddress.getByName("localhost"),它就无法从客户端接收任何内容。但是,如果客户端发送到InetAddress.getLocalHost(). 端口是正确的,它会很好地工作。

有人知道区别吗?提前致谢。

【问题讨论】:

可能getLocalHost() 方法会进行名称解析并将地址解析为 127.0.0.1(或任何其他 ip)。于是问题就变成了:localhost和127.0.0.1有什么区别。在这里查看:***.com/questions/7382602/… 不,System.out.println(InetAddress.getByName("localhost").equals(InetAddress.getByName("127.0.0.1"))) 给了我真的 因为getByNa‌megetLocalhost 方法都会返回一个InetAddress 对象。 equals 方法在 InetAddress 类中被覆盖,如果 IP 相同,则返回 true。在这里查看:docs.oracle.com/javase/7/docs/api/java/net/… 【参考方案1】:

来自 getLocalHost() 的 JDK 文档:

返回本地主机的地址。这是通过从系统中检索主机的名称,然后将该名称解析为 InetAddress 来实现的。

在我的 GNU/Linux 机器中,我的主机名是“laptop”,它映射到 /etc/hosts 中不同于 127.0.0.1 的地址。在 C:\Windows\System32\drivers\etc\hosts 在 Windows 中有一个等效文件。

默认情况下,在 DNS 查找之前搜索此主机文件。

【讨论】:

【参考方案2】:

ad1 为您提供了您在 LAN/WAN 中的地址,看起来 (我的意思是本地/私有网络 IP 地址,例如 192.168.0.108 或类似 10.3.6.55)。

另见:

http://en.wikipedia.org/wiki/Private_network#Private_IPv4_address_spaces

http://download.java.net/jdk7/archive/b123/docs/api/java/net/InetAddress.html#getLocalHost%28%29

但请注意,在我的示例中,ad2 和 ad3 是相等的。

import java.net.InetAddress;

public class Test014 

    public static void main(String[] args) throws Exception 
        InetAddress ad1 = InetAddress.getLocalHost();
        InetAddress ad2 = InetAddress.getByName("localhost");
        InetAddress ad3 = InetAddress.getByName("127.0.0.1");

        printArr(ad1.getAddress());
        printArr(ad2.getAddress());
        printArr(ad3.getAddress());

        System.out.println(ad1.equals(ad2));
        System.out.println(ad1.equals(ad3));
        System.out.println(ad2.equals(ad3));
    

    static void printArr(byte[] arr)
        for (int i=0; i<arr.length; i++)
            System.out.print("[" + i + "] = " + arr[i] + "; ");
        
        System.out.println();
        System.out.println("---------");
    


此外,请查看 API 文档,了解 equals 方法何时返回 true 以及何时返回 false。

http://download.java.net/jdk7/archive/b123/docs/api/java/net/InetAddress.html#equals%28java.lang.Object%29

【讨论】:

现在我明白为什么 equal 返回 false 了。但我只有一个网络适配器。如果我在 192.168.1.108 上绑定 udp 套接字,发送到 127.0.0.1 的数据包也应该收到,对吗? 我认为 - 不是真的。看这里。 ***.com/questions/7556811/… 我知道服务器通常有特殊的标志/开关来告诉他们监听所有已知的地址/接口。你实际上是在写一个服务器。因此,您为传入连接打开服务器端口的地址很重要。 – peter.petrov 5 分钟前

以上是关于在java中,InetAddress.getLocalHost() 和 InetAddress.getByName("127.0.0.1") 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

在java中,啥是队列?

java文件在eclipse中可以运行,在cmd中javac命令运行正确,java命令报错

在java中怎样在有名包中引用无名包中的类

在java中,啥是接口,接口的特点是啥

在java中变量和属性有啥不同

java中final的用法