连接到Internet的设备称为节点(node)。计算机节点称为主机(host)。每个节点或主机都由至少一个唯一的数来标识,这称为Internet地址或IP地址。目前大多数的IP地址是四字节长,这被称作IPv4地址。随着网络地址的不断增加IPv4已经不足现有的计算机使用,所以又出现了16字节长的地址,称之为IPv6地址。
为了方便人们记忆,Internet的设计者发明了域名系统(Domain Name System,DNS)。DNS将人们可以记忆的主机名与计算机可以记忆的IP地址关联在一起。服务器通常至少有一个主机名。客户端往往有一个主机名,但也可能没有。
InetAddress类
java.netInetAddress类是Java对IP地址的高层表示。大多数其他网络类都要用到这个类,包括socket、serverSocket、URL、DatagramSocket、DatagramPacket等。一般地讲,它包括一个主机名和一个IP地址。
创建新的InetAddress对象:InetAddress类没有公共构造函数。实际上,InetAddress有一些静态工厂方法,可以连接到DNS服务器来解析主机名。如:InetAddress.getByName("xxx.com");这个方法会建立与本地DNS服务器的一个连接,来查找名字和数字地址,如果DNS服务器找不到这个地址,这个方法会抛出一个UnKnownEception异常。
缓存:由于DNS查找的开销可能相当大,所以InetAddress类会缓存查找的结果。一旦得到一个给定主机的地址,就不会再次查找,即使你为同一个主机创建一个新的InetAddress对象,也不会再次查找地址。
按IP查找:调用getByName()并提供一个IP地址串作为参数时,会为所请求的IP地址创建一个InetAddress对象,而不检查DNS。主机名要比IP地址稳定得多。有些服务多年以来一直使用同一个主机名,但IP地址更换了很多次。
Inet4Address和Inet6Address
IPv4地址一般写为四个无符号字节,每字节范围从0到255,最高字节在前。为方便人们查看,各字节用点号分隔。例如:152.18.11.123.这称为点分四段(dotted quad)格式。
IPv6地址通常写为冒号分隔的8个区块,每个区块是4个十六进制数字。例如:2400:cb00:2048:0001:0000:0000:6ca2:c665.前导的0不需要写出,因此可以简写为:2400:cb00:2048:1:0:0:6ca2:c665。
在IPv6和IPv4的混合网络中,IPv6地址的最后4个字节有时写为IPv4的点分四段地址。
NetworkInterface类
NetworkInterface类表示一个本地IP地址。这可以是一个物理接口,如额外的以太网卡,也可以是一个虚拟接口,与机器的其他IP地址绑定到同一个物理硬件。NetworkInterface类提供了一些方法可以枚举所有本地地址,并由它们创建InetAddress对象,然后这些InetAddress对象可用于创建socket、服务器soc等。
一些有用的程序
在了解了InetAddress一些知识之后,我们可以编写一些很有用的程序。比如IP过滤系统,每个请求的IP过来的时候,我们可以进行一些匹配过滤,而保证服务器的安全。还可以写一些web服务器文件日志系统,来记录每个访客的IP。