Java使用InetAddress类获取主机名和IP地址(学习笔记)

Java提供一系列的类支持Java程序访问网络资源。Java.net包中有InetAddress类的定义,InetAddress类的对象用于IP地址和域名。它代表了一个网络目标地址,包括主机名和数字类型的地址信息。该类有两个子类,Inet4Address和Inet6Address,分别对应了目前IP地址的两个版本。

 

实例化一个InetAddress类,因为此类无构造方法,所以实例化此类只需要使用静态方法。

开发者门户中使用 InetAddress.getByName(hostName); 方法来判断域名DNS解析是否正确:

	@RequestMapping(value = "/getStatus", method = RequestMethod.GET)
	@ResponseBody
	public boolean getStatus(String hostName){
		try {
		      InetAddress.getByName(hostName);
		      return true;
		     
		 }catch (Exception e) {
		       return false;
		 }
	}

 

一般来说,此方法若传入的hostName域名DNS解析有效,则能返回一个InetAddress对象。

通过该对象获取该域名主机IP地址。

 

同样可通过给定的原始IP地址,返回一个InetAddress对象:

InetAddress inetAddress=InetAddress.getByAddress(b); 

String domainName = inetAddress.getHostName();//获得主机名
String IPName = inetAddress.getHostAddress();//获得IP地址

System.out.println(domainName);
System.out.println(IPName);

其中的b为一个字节数组 ,参数按网络字节顺序:地址的高位字节位于 getAddress()[0] 中,IPv4 地址 byte 数组的长度必须为 4 个字节,IPv6 byte 数组的长度必须为 16 个字节。

 

获取原始IP地址时,返回的是一个字节数组,如果把这个字节输出到控制台下的话,会显示此字节数组在内存中的存放地址。输出时用了address[0]等数组的形式输出字节,其中如果字节数组中的某个字节大于128的话,将会导致输出来的数字是负数,应此我把我的IP地址中超过128的加上256,便没问题。

 

注:32位二进制网络地址

A(1.0.0.0-126.255.255.255):0,7位网络号,后24位为主机号;
B(128.0.0.0-191.255.255.255):10,14位网络号,后16位为主机号;
C(192.0.0.0-223.255.255.255):110,21位网络号,后8位为主机号;
D(224.0.0.0-239.255.255.255):1110,28位多点广播组标号;
E(240.0.0.0-254.255.255.255):1111,保留试验使用。

 

InetAddress的主要方法

— toString() 方法,将此 IP 地址转换为 String。
— byte[ ] getAddress() 方法,返回此 InetAddress 对象的原始 IP 地址。如果将此字节数组输出在控制台下,会出现一个存放此字节数组的内存地址。
— String getCanonicalName() 方法, 获取此 IP 地址的完全限定域名。
— String getHostAddress() 方法,返回 IP 地址字符串(以文本表现形式)。
— String getHostName() 方法,获取此 IP 地址的主机名。
— boolean isReachable(int timeout) 方法,测试是否可以达到该地址。

 

 

有时主机名可能比较复杂,会使用主机别名。因此获取主机名需要特定的方法:

public String getCanonicalHostName()

该方法和getHostName方法一样,也是得到远程主机的域名。区别是,该方法得到的是主机名,getHostName得到的是主机别名。

1. 使用 getLocalHost() 创建InetAddress对象

    此时getCanonicalHostName方法和getHostName方法得到的都是本机名

2. 使用域名 创建InetAddress对象

    使用域名创建InetAddress对象后,getHostName方法不会访问DNS服务器

    但getCanonicalHostName方法就不一定了,这取决于DNS服务器如何解释主机名和主机别名

3. 使用IP地址 创建InetAddress对象

    此时getCanonicalHostName方法和getHostName方法完全相同,返回的都是主机名,而不是主机别名。

转载于:https://my.oschina.net/u/3448620/blog/1507566

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值