引出
开发网络程序的第一步是确定通信双方的主机地址。在Java中,使用InetAddress类的对象来表示主机的IP地址,该对象中也包含了一系列关于IP地址和域名的相关操作方法。
一、地址的表示
1、表示的两种形式
- IP地址形式
- 主机名形式
以百度为例,其主机名为 www.baidu.com,IP地址形式为 111.13.100.91 / 111.13.100.92。百度的主机名只有一个,但是IP地址却有两个,其实这是为了实现网络访问的负载均衡。(这里不多介绍)
2、建议使用主机名的形式表示主机对象。
好处:
- 可以由DNS服务器选择负载轻的主机IP地址返回给客户端----->保证了访问质量
- 当主机进行了地址迁移时,主要主机名不变,程序就不需要做任何修改仍能保证正常运行
二、获取地址
导入包 java.net.InetAddress
1、创建对象
不是通过构造方法来创建对象,而是通过若干个静态方法来获取表示主机IP地址的InetAddress对象。
2、最常用的静态方法:InetAddress.getByName()
public static InetAddress getByName(String host) throws UnknownHostException
注:
①host:一个字符串形式的域名或者IP地址。
②例如:创建域名为www.baidu.com的InetAddress对象 。
InetAddress address = InetAddress.getByName("www.baidu.com");
③该方法不只是把host当做字符串,而是与本机所设置的DNS服务器建立连接,对该字符串进行解析。如果DNS找不到这个地址,就会抛出UnknownHostException异常。
④除了使用主机名形式外,还可以使用IP地址。
InetAddress address = InetAddress.getByName("111.13.100.91");
System.out.println(address.getHostName());
3、简单使用
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Example1 {
public static void main(String[] args) {
try {
InetAddress addr1 = InetAddress.getByName("www.baidu.com");// 使用域名创建对象
InetAddress addr2 = InetAddress.getByName("220.181.111.37");// 使用IP地址创建对象
//InetAddress add2 = InetAddress.getByName("IFC-PCB-094");// 根据主机名创建对象
System.out.println("地址1:" + addr1);
System.out.println("地址1主机" + addr1.getHostName());
System.out.println("地址2:" + addr2);
System.out.println("IP地址的哈希码:" +addr2.hashCode());
byte[] ip_b = {111,13,100,91};//用字节数组创建一个InetAddress对象
InetAddress addr3 = InetAddress.getByAddress("www.null.cn",ip_b);
System.out.println("地址3:" + addr3);
InetAddress addr4 = InetAddress.getLocalHost();//获取本机地址对象
System.out.println("本机的IP地址对象:" + addr4);
System.out.println("本机的计算机名:" + addr4.getHostName());
} catch (UnknownHostException e) {
System.out.println("host unknown or error!");
}
}
}
注:
- 使用IP地址的字符串形式创建,此地址不做任何连网验证。
- addr3对象的创建不进行连网验证,所以不产生异常。
- 要注意和addr1创建方式的不同之处
- InetAddress类有两个子类:Inet4Address和Inet6Address----->分别针对具体的IPv4地址和IPv6地址。