网络编程|InetAddress类

引出

开发网络程序的第一步是确定通信双方的主机地址。在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地址。

猜你喜欢

转载自blog.csdn.net/Geekst/article/details/89436908