Java网络编程之InetAddress浅析

一个人想着一个人 提交于 2021-02-19 04:33:55

Java网络编程之InetAddress浅析

一、InetAddress综述

  IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础。InetAddress是Java对IP地址的封装,几乎所有的Java网络相关的类都和它有关系,例如:serversocket,socket,URL,DataGramSocket,DataGRamPacket等。

  InetAddress的实例对象包含以数字形式保存的IP地址,同时还可能包含主机名(如果使用主机名来获取InetAddress的实例,或者使用数字来构造,并且启用了反向主机名解析的功能)。InetAddress类提供了将主机名解析为IP地址(或反之)的方法。

  InetAddress对域名进行解析是使用本地机器配置或者网络命名服务(如域名系统(Domain Name System,DNS)和网络信息服务(Network Information Service,NIS))来实现。对于DNS来说,本地需要向DNS服务器发送查询的请求,然后服务器根据一系列的操作,返回对应的IP地址,为了提高效率,通常本地会缓存一些主机名与IP地址的映射,这样访问相同的地址,就不需要重复发送DNS请求了。在java.net.InetAddress类同样采用了这种策略。在默认情况下,会缓存一段有限时间的映射,对于主机名解析不成功的结果,会缓存非常短的时间(10秒)来提高性能。

  Java提供了InetAddress类来代表IP地址,InetAddress下还有2个子类:Inet4Address、Inet6Address,它们分别代表Internet Protocol version 4(IPv4)地址和Internet Protocol version 6(IPv6)地址,不过这两个子类不常用,这里也不在赘述。

  此外,InetAddress类没有提供构造器,而是提供了如下两个静态方法来获取InetAddress实例:

  getByName(String host):根据主机获取对应的InetAddress对象。

  getByAddress(byte[] addr):根据原始IP地址来获取对应的InetAddress对象。

二、InetAddress数据结构

可见,InetAddress实现了Serializable接口,其对象可序列化

三、InetAddress方法摘要

方法摘要
 boolean equals(Object obj)
          将此对象与指定对象比较。
 byte[] getAddress()
          返回此 InetAddress 对象的原始 IP 地址。
static InetAddress[] getAllByName(String host)
          在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
static InetAddress getByAddress(byte[] addr)
          在给定原始 IP 地址的情况下,返回 InetAddress 对象。
static InetAddress getByAddress(String host, byte[] addr)
          根据提供的主机名和 IP 地址创建 InetAddress。
static InetAddress getByName(String host)
          在给定主机名的情况下确定主机的 IP 地址。
 String getCanonicalHostName()
          获取此 IP 地址的完全限定域名。
 String getHostAddress()
          返回 IP 地址字符串(以文本表现形式)。
 String getHostName()
          获取此 IP 地址的主机名。
static InetAddress getLocalHost()
          返回本地主机。
 int hashCode()
          返回此 IP 地址的哈希码。
 boolean isAnyLocalAddress()
          检查 InetAddress 是否是通配符地址的实用例行程序。
 boolean isLinkLocalAddress()
          检查 InetAddress 是否是链接本地地址的实用例行程序。
 boolean isLoopbackAddress()
          检查 InetAddress 是否是回送地址的实用例行程序。
 boolean isMCGlobal()
          检查多播地址是否具有全局域的实用例行程序。
 boolean isMCLinkLocal()
          检查多播地址是否具有链接范围的实用例行程序。
 boolean isMCNodeLocal()
          检查多播地址是否具有节点范围的实用例行程序。
 boolean isMCOrgLocal()
          检查多播地址是否具有组织范围的实用例行程序。
 boolean isMCSiteLocal()
          检查多播地址是否具有站点范围的实用例行程序。
 boolean isMulticastAddress()
          检查 InetAddress 是否是 IP 多播地址的实用例行程序。
 boolean isReachable(int timeout)
          测试是否可以达到该地址。
 boolean isReachable(NetworkInterface netif, int ttl, int timeout)
          测试是否可以达到该地址。
 boolean isSiteLocalAddress()
          检查 InetAddress 是否是站点本地地址的实用例行程序。
 String toString()
          将此 IP 地址转换为 String

四、代码示例

 1 package me.net.ip;
 2 
 3 import java.net.InetAddress;
 4 import java.net.UnknownHostException;
 5 
 6 /**
 7  * InetAddress用来代表IP地址 一个InetAddress对象代表一个IP地址
 8  * 
 9  * @author Administrator
10  *
11  */
12 public class TestInetAddress {
13 
14     public static void main(String[] args) throws UnknownHostException {
15     //如何创建一个InetAddress对象
16     InetAddress inet = InetAddress.getByName("www.baidu.com");
17     System.out.println(inet);
18     System.out.println(inet.getHostName());
19     System.out.println(inet.getHostAddress());
20     //获取本机信息
21     inet = InetAddress.getLocalHost();
22     System.out.println(inet);
23     System.out.println(inet.getHostName());
24     System.out.println(inet.getHostAddress());
25     }
26 
27 }

如果,您对我的这篇博文有什么疑问,欢迎评论区留言,大家互相讨论学习。
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博文感兴趣,可以关注我的后续博客,我是【AlbertRui】。

转载请注明出处和链接地址,欢迎转载,谢谢!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!