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