论坛首页 入门技术论坛

关于InetAddress和NetworkInterface的区别和用法

浏览 3110 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-25  
关于InetAddress和NetworkInterface的用法。

最近看到有些朋友在问答区贴了关于IP地址和网卡相关的问题(http://www.iteye.com/problems/7462),自己正好也刚看了Java Networking Programming一书,有些小小的总结和大家分享一下。


1. DNS,主机名及IP地址
大家对DNS都不陌生,这是Internet上的一种通用服务,用于在数字形式的ip地址和人类容易记忆的主机名两种形式之间进行转换。如果你想要使用主机名来访问Internet上的主机,那么一般来说你所在的局域网内必定有本地DNS的存在。

Ip地址和主机名之间不一定是1对1的映射关系,还可以是:
a) 一个ip地址对应到多个主机名.
  这其实很自然的,本质上是多个网络服务对应到一个ip地址(一台真正的计算机)。主机名和ip的对应关系可以改变,这样即使把服务迁移到其他机器上,只要客户是使用主机名(服务名),那就不会到受影响。

b) 一个主机名对应多个ip地址(即多个主机)
  这也很常见,如www.microsoft.com就对应了多个ip地址(多台真正的计算机)。这种用法一般用于负载均衡。


2. 类InetAddress (这个类其实主要是和DNS打交道的)
在使用合适的工厂初始化之后(初始化时一般你传入ip或主机地址中的任意一个),InetAddress实例中会存储主机名和ip地址信息(多数是查询DNS得来的,但你也可以自己任意指定从而创造出实际上是非法或不存在的主机名/ip地址组合)。

使用这个类,我们可以通过主机名来获取ip地址,也可以通过ip地址来获取主机。我们还可以通过InetAddress.getLocalHost()方法来获取本地的ip地址和主机名,但要注意地是,这里的查询结果是登记在本地dns中的信息。而不是大家可能会想到的枚举本地网卡。

想要枚举本地网卡或者查询本地网络接口的信息,则要使用类 NetworkInterface。

InetAddress的equals方法比较特殊,它仅仅比较了ip地址,而没有比较主机名。所以多个映射到同一个ip地址(同一台计算机)的主机名被认为是相同的。而一个主机名被映射到多个ip地址,那么这些地址即使主机名相同,也会被认为是不同的InetAddress。

3. 类 NetworkInterface(这个类代表了本地的网络接口)
本类可以代表实际的硬件(网卡)或虚拟的网络地址。你可以使用getNetworkInterfaces方法来枚举本地网络接口。也可以通过传入网卡名(如eth0或lo)来获得本类的实例。


论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics