一、InetAddress
java.net.InetAddress类是java对IP地址的高层表示。通过主机查找IP的时候会查询DNS服务器,开销会很大,因此InetAddress类会缓存中查找。对于DNS的缓存时间可以用系统属性networkaddress.cache.ttl指定成功的DNS结果在java缓存中保留的时间(秒数),networkaddress.cache.negative.ttl指定不成功的查找结果缓存时间。
该类没有构造函数,提供了以下静态方法构造。
静态方法摘要----------
InetAddress getByName(String host)
host----可以是主机名。例如"www.baidu.com"或者直接IP地址“180.97.33.107”。如果主机名不存在则报java.net.UnknownHostException异常
InetAddress[] getAllByName(String host)
host----可以是主机名。例如"www.baidu.com"或者直接IP地址“180.97.33.107”。返回多个地 址,
有的主机名可以存在多个地址。
InetAddress[] allByName = InetAddress.getAllByName("www.baidu.com"); for (InetAddress address : allByName) { System.out.println(address); }
输出结果如下:
![](/qrcode.jpg)
www.baidu.com/180.97.33.107
www.baidu.com/180.97.33.108
InetAddress getByAddress(byte[] addr)
InetAddress getByAddress(String host, byte[] addr)
这两个方法不能保证主机一定存在,或者主机名能正确的映射IP地址。
InetAddress.getLocalHost()
这个方法尝试连接DNS来得到一个真正的主机名和IP地址。不过如果失败,他就返回回送地址。
主要方法摘要---------
String getHostName()
String getCanonicalHostName()
getHostName只是在不知道主机名的时候才会联系DNS,但是getCanonicalHostName知道主机名也会联系DNS。另外一个区别是getHostName返回主机的别名,而getCanonicalHostName返回主机的名字,之所以要使用主机别名,是因为有时主机名可能比较复杂,如Oracle官方网站的主机名bigip-otn-portal.oracle.com,因此,为了使用户访问网站更方便,就增加了更简单的主机别名,如www.oracle.com。一个主机名可能对应多个主机别名,如oracle.com也是Oracle的主机别名。在IE的地址栏中输入http:// bigip-otn-portal.oracle.com和http://oracle.com都可以访问Oracle官方网站。但我们发现,有很多网站通过主机名无法访问,只有通过一些别名才能访问,如126只能通过www.126.com和126.com两个主机别名访问,而不能通过它的主机名zz-9-77-a8.bta.net.cn来访问。这是因为在服务端通过HTTP协议做了限制.
String getHostAddress()
byte[] getAddress()
可以通过byte的长度来区分Ip地址为ipv4或者ipv6。另外返回的字节是无符号的,值大于127的时候会当做负数。
InetAddress address = InetAddress.getByName("www.oracle.com"); System.out.println(address.getHostAddress()); System.out.println(Arrays.toString(address.getAddress()));
输出结果:
23.3.200.18
[23,3,-56, 18]
地址类型:
boolean isAnyLocalAddress()
ipv4的通配地址是0:0:0:0。ipv6的通配地址是:0:0:0:0:0:0:0:0
boolean isLoopbackAddress()
是否为回送地址,ipv4的地址为127.0.0.1。ipv6是0:0:0:0:0:0:0:1
boolean isMulticastAddress()
是否为组播地址:ipv4址覆盖范围为224.0.0.0~239.255.255.255。ipv6意FF开头。
isReachable(int timeout)
boolean isReachable(NetworkInterface netif, int ttl,int timeout)
可以测试一个特定节点对当前主机是否可达,这些方法尝试使用tranceroute查看地址是否可达。如果主机在timeout内响应,则方法返回true;否则返回false。
二、NetworkInterface
表示一个本地IP地址,可以是一个物理接口,也可以是一个虚拟接口。
静态方法:
NetworkInterface getByName(String name)
name----例如eth0、lo
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces(); while (networkInterfaces.hasMoreElements()) { NetworkInterface nextElement = networkInterfaces.nextElement(); System.out.println(nextElement); Enumeration<InetAddress> inetAddresses = nextElement.getInetAddresses(); while (inetAddresses.hasMoreElements()) { System.out.println(inetAddresses.nextElement()); } }