InetAddress类是Java对IP地址(包括IPv4和IPv6)的高层表示。大多数其他网络类都要用到这个类,包括Socket,ServerSocket,URL,DatagramSocket,DatagramPacket等。一般来讲,它包括一个主机名和一个IP地址。
创建InetAddress对象
通过主机名创建
package com.dy.xidian;import java.net.InetAddress;
import java.net.UnknownHostException;public class Create {
</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] args){ </span><span style="color: #0000ff">try</span><span style="color: #000000"> { </span><span style="color: #008000">//</span><span style="color: #008000">查询我的网站IP</span> InetAddress address = InetAddress.getByName("www.xdysite.cn"<span style="color: #000000">); System.out.println(</span>"my site:"+<span style="color: #000000">address.getHostAddress()); </span><span style="color: #008000">//</span><span style="color: #008000">查询百度的所有IP</span> InetAddress[] baidu = InetAddress.getAllByName("www.baidu.com"<span style="color: #000000">); System.out.println(</span>"baidu:"<span style="color: #000000">); </span><span style="color: #0000ff">for</span><span style="color: #000000">(InetAddress addr : baidu) System.out.println(</span>" "+<span style="color: #000000">addr.getHostAddress()); </span><span style="color: #008000">//</span><span style="color: #008000">查询本机IP </span><span style="color: #008000">//</span><span style="color: #008000">如果主机名存在且是一个FQDN的话,那么会得到真实的IP地址,否则会得到127.0.0.1</span> InetAddress local =<span style="color: #000000"> InetAddress.getLocalHost(); System.out.println(</span>"local:"+<span style="color: #000000">local.getHostAddress()); } </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (UnknownHostException e) { e.printStackTrace(); } }
}
传入的参数为主机名,在构建InetAddress对象时,会去DNS服务器中获取对应的地址,如果在DNS中查找不到对应的IP地址,前两个会抛异常(UnknownHostException),getLocalHost()则会返回localhost和127.0.0.1。
通过IP创建
InetAddress address = InetAddress.getByName("202.117.119.1");
System.out.println(address.getHostName());
传入的是IP地址,则在构建InetAddress时不会去检查DNS。只有当显示的调用了getHostName(),才会完成主机名的DNS查找。
可达性测试
InetAddress类有两个isReachable(),来测试目标地址是否可达。
try{ InetAddress address = InetAddress.getByName("www.xdysite.cn"); if(address.isReachable(2000)) System.out.println("可以连接到该主机"); else System.out.println("无法连接"); }catch(Exception e){ e.printStackTrace(); }
该方法会使用ICMP echo请求来查看指定地址是否可达。isReachable()的参数是超时时间timeout,单位为毫秒。如果在timeout之内有响应,则返回true,否则返回false。
equals方法
InetAddress类重写了equals方法。如果一个对象本身是InetAddress类的实例,而且与一个InetAddress对象有相同的IP地址,则这两个对象通过equals方法进行判断是相等的。
public static void main(String[] args){ try{ InetAddress address1 = InetAddress.getByName("www.xdysite.cn"); InetAddress address2 = InetAddress.getByName("test.xdysite.cn"); if(address1.equals(address2)) System.out.println("相同"); else System.out.println("不同"); }catch(Exception e){ e.printStackTrace(); } }
www.xdysite.cn与test.xdysite.cn指向同一台主机,所以上面的代码运行后会输出相同。