类的使用
1. java.net.InetAddress 类的使用
1.1. 简介
IP 地址是 IP 使用的 32 位(IPv4)或者 128 位(IPv6)位无符号数字,它是传输层协议
TCP,UDP 的基础。InetAddress 是 Java 对 IP 地址的封装,在 java.net 中有许多类都使用到
了 InetAddress,包括 ServerSocket,Socket,DatagramSocket 等等。
InetAddress 的实例对象包含以数字形式保存的 IP 地址,同时还可能包含主机名(如果使用
主机名来获取 InetAddress 的实例,或者使用数字来构造,并且启用了反向主机名解析的功
能)。InetAddress 类提供了将主机名解析为 IP 地址(或反之)的方法。
InetAddress 对域名进行解析是使用本地机器配置或者网络命名服务(如域名系统( Domain
Name System,DNS)和网络信息服务(Network Information Service,NIS))来实现。对
于 DNS 来说,本地需要向 DNS 服务器发送查询的请求,然后服务器根据一系列的操作,
返回对应的 IP 地址,为了提高效率,通常本地会缓存一些主机名与 IP 地址的映射,这样
访问相同的地址,就不需要重复发送 DNS 请求了。在 java.net.InetAddress 类同样采用了这
种策略。在默认情况下,会缓存一段有限时间的映射,对于主机名解析不成功的结果,会
缓存非常短的时间(10 秒)来提高性能。
1.2. InetAddress 对象的获取
InetAddress 的构造函数不是公开的(public),所以需要通过它提供的静态方法来获取,有
以下的方法:
static InetAddress[] getAllByName(String host)
static InetAddress getByAddress(byte[] addr)
static InetAddress getByAddress(String host,byte[] addr)
static InetAddress getByName(String host)
static InetAddress getLocalHost()
在这些静态方法中,最为常用的应该是 getByName(String host)方法,只需要传入目标主机
的名字,InetAddress 会尝试做连接 DNS 服务器,并且获取 IP 地址的操作。代码片段如下,
注意我们假设以下的代码,都是默认导入了 java.net 中的包,在程序的开头加上 import
java.net.*,否则需要指定类的全名 java.net.InetAddress。