Java使用InetAddress类获取主机名和IP地址(学习笔记)
博客专区 > ND小龙 的博客 > 博客详情
Java使用InetAddress类获取主机名和IP地址(学习笔记)
ND小龙 发表于5个月前
Java使用InetAddress类获取主机名和IP地址(学习笔记)
  • 发表于 5个月前
  • 阅读 2
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

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方法完全相同,返回的都是主机名,而不是主机别名。

共有 人打赏支持
粉丝 10
博文 45
码字总数 2295
×
ND小龙
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: