`

Internet地址

阅读更多

一、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);
}

    输出结果如下:

 

          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.comhttp://oracle.com都可以访问Oracle官方网站。但我们发现,有很多网站通过主机名无法访问,只有通过一些别名才能访问,如126只能通过www.126.com126.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());
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics