InetAddress 解析

InetAddress 解析IP地址分为IPv4和IPv6。IPv44字节长的ip称为IPv4.目前大部分ip都是IPv4。IPv4地址一般写为四哥无符号的字节,每个字节范围从0到255,最高字节在前面。为方便人们查看,各字节用点号分割。例如:192.168.1.100.这称为点分四段格式。IPv616字节长的ip成为IPv6.IPv6地址通常些微冒号分割的8个区块,每个区块4个十六进制数字。例如:2400:c

大家好,又见面了,我是你们的朋友全栈君。

IP地址分为IPv4 和IPv6。

IPv4

4字节长的ip称为IPv4.目前大部分ip都是IPv4。 IPv4地址一般写为四哥无符号的字节,每个字节范围从0到255,最高字节在前面。为方便人们查看,各字节用点号分割。
例如:192.168.1.100.这称为点分四段格式。

IPv6

16字节长的ip成为IPv6.
IPv6地址通常些微冒号分割的8个区块,每个区块4个十六进制数字。
例如:2400:cb00:2048:1:0:0:6ca2:c665

两个冒号标识多个0区块,但每个地址中双冒号之多出现一次。
例如:2001:1234:4567:0000:0000:0000:8888可以缩写为 2001:1234:4567::8888。

IPv6和IPv4的混合网络中,IPv6地址的最后4字节有时些微IPv4的点分四段地址。
例如:2001:1234:4567::c0a8:0a64可以写为 2001:1234:4567::192.168.10.100

ip地址对于计算机来说很不错,但位于人来说是个问题,于是就发明了域名系统(Domain Name System, DNS)。DNS将人们可以记忆的主机名与计算机可以记忆的IP地址关联在一起。服务器至少有一个主机名。客户端往往有一个主机名,但也可能没有,特别是有些客户端的IP地址会在启动的时候动态指定。

IP地址和域名可以1:1、 1:多 、 多:1 、 多:多。
可以通过一个域名对应多个ip,来实现DNS的负载均衡。

InetAddress类

java.net.IntAddress类是java对IP地址的高层表示。大多数其它网络类都要用到这个类,包括Socket、ServerSocket、URL、DatagramSocket、DatagramPacket等。它包括一个主机名和一个IP地址。

创建InetAddress 对象

  1. 根据域名创建InetAddress对象
    InetAddress addr1 = InetAddress.getByName(“www.baidu.com”);

    [HostName : www.baidu.com] [HostAddress: 220.181.112.244]

  2. 根据ip创建InetAddress对象
    InetAddress addr2 = InetAddress.getByName(“220.181.112.244”);

    [HostName : 220.181.112.244] [HostAddress: 220.181.112.244]
    如果获取不到主机名就返回ip

  3. 根据主机名创建InetAddress对象
    InetAddress addr3 = InetAddress.getByName(“IFC-PCB-094”);

    [HostName : IFC-PCB-094] [HostAddress: 192.168.3.249]

  4. 获取本机的InetAddress,如果获取不到(可能是安全问题)就会返回 地址:127.0.0.1 和 主机名:localhost
    InetAddress addr4 = InetAddress.getLocalHost();

    [HostName : IFC-PCB-094] [HostAddress: 192.168.3.249]

  5. 根据 ip字节数组创建 InetAddress 对象
    public static InetAddress getByAddress(byte[] addr)
    InetAddress addr = InetAddress.getByAddress(new byte[]{-64,-88,0,1});

    [HostName : jijs] [HostAddress: 192.168.0.1]

  6. 根据域名和 ip字节数组创建 InetAddress 对象
    InetAddress addr = InetAddress.getByAddress(“jijs”,new byte[]{-64,-88,0,1});

    [HostName : jijs] [HostAddress: 192.168.0.1]

  7. 获取该主机的所有的地址,返回一个InetAddress[] 对象
    public static InetAddress[] getAllByName(String host)

InetAddress[] addr = InetAddress.getAllByName("www.baidu.com");
for (InetAddress inetAddress : addr) {
    System.out.println(inetAddress);
}

输出:
www.baidu.com/220.181.112.244
www.baidu.com/220.181.111.188

获取方法

//获取主机名
public String getHostName();
//获取主机名(每次方法都解析DNS去获取主机名,而不从缓存中获取)
public String getCanonicalHostName();
//获取以字节数组形式的ip地址。
public byte[] getAddress();
//获取点分四段式ip。
public String getHostAddress();
  1. getHostName()
    该方法返回主机名或ip。如果这台机器没有主机名或者安全管理器阻止确定主机名,就会返回四段式ip地址,否则返回主机名。
  2. getCanonicalHostName()
    获取主机名,每次方法都解析DNS去获取主机名,而不从缓存中获取。
  3. getAddress()
    获取ip地址的字节数组,如果IPv4则返回4个长度的字节数组,如果是IPv6则返回16个长度的字节数组。
    我们可以根据返回的字节长度来判断是IPv4还是IPv6。
  4. getHostAddress()
    返回一个点分四段式ip字符串。

地址类型

public boolean isMulticastAddress();
public boolean isAnyLocalAddress();
public boolean isLoopbackAddress();
public boolean isLinkLocalAddress();
public boolean isSiteLocalAddress();
public boolean isMCGlobal();
public boolean isMCNodeLocal();
public boolean isMCLinkLocal();
public boolean isMCSiteLocal();
public boolean isMCOrgLocal();
  1. isMulticastAddress()
    当IP地址是广播地址(MulticastAddress)时返回true,否则返回false。
    通过广播地址可以向网络中的所有计算机发送信息,而不是只向一台特定的计算机发送信息。IPv4的广播地址的范围是224.0.0.0 ~ 239.255.255.255.IPv6的广播地址第一个字节是FF,其他的字节可以是任意值。

  2. isAnyLocalAddress()
    当IP地址是通配符地址时返回true,否则返回false。
    IPv4的通配符地址是0.0.0.0
    IPv6的通配符地址是0:0:0:0:0:0:0:0,也可以简写成::。

  3. isLoopbackAddress()
    当IP地址是loopback地址时返回true,否则返回false。
    loopback地址就是代表本机的IP地址。
    IPv4的loopback地址的范围是127.0.0.0 ~ 127.255.255.255,也就是说,只要第一个字节是127,就是lookback地址。如127.1.2.3、127.0.200.200都是loopback地址。
    IPv6的loopback地址是0:0:0:0:0:0:0:1,也可以简写成::1

  4. isLinkLocalAddress()
    当IP地址是本地连接地址(LinkLocalAddress)时返回true,否则返回false。
    IPv4的本地连接地址的范围是169.254.0.0 ~ 169.254.255.255。
    IPv6的本地连接地址的前12位是FE8,其他的位可以是任意取值,如FE88::和FE80::ABCD::都是本地连接地址。

  5. isSiteLocalAddress()
    当IP地址是地区本地地址(SiteLocalAddress)时返回true,否则返回false。(是不是内网ip)
    IPv4的地址本地地址分为三段:10.0.0.0 ~ 10.255.255.255、172.16.0.0 ~ 172.31.255.255、192.168.0.0 ~ 192.168.255.255。(企业内部或个人内部的局域网内部的ip都应该在此三个网段内)
    IPv6的地区本地地址的前12位是FEC,其他的位可以是任意取值,如FED0:: 和 FEF1:: 都是地区本地地址。

  6. isMCGlobal()
    当IP地址是全球范围的广播地址时返回true,否则返回false。
    全球范围的广播地址可以向Internet中的所有的计算机发送信息。
    IPv4的广播地址除了224.0.0.0和第一个字节是239的IP地址都是全球范围的广播地址。
    IPv6的全球范围的广播地址中第一个字节是FF,第二个字节的范围是0E ~ FE,其他的字节可以是任意值,如FFBE::、FF0E::都是全球范围的广播地址。

  7. isMCNodeLocal()
    当IP地址是本地接口广播地址时返回true,否则返回false。
    本地接口广播地址不能将广播信息发送到产生广播信息的网络接口,即使是同一台计算机的另一个网络接口也不行。所有的IPv4广播地址都不是本地接口广播地址。IPv6的本地接口广播地址的第一个字节是FF,第二个节字的范围是01 ~ F1,其他的字节可以是任意值,如FFB1::、FF01:A123::都是本地接口广播地址。

  8. isMCLinkLocal()
    当IP地址是子网广播地址时返回true,否则返回false。
    使用子网的广播地址只能向子网内的计算机发送信息。
    IPv4的子网广播地址的范围是224.0.0.0 ~ 224.0.0.255。
    IPv6的子网广播地址的第一个字节是FF,第二个字节的范围是02 ~ F2,其他的字节可以是任意值,如FFB2:: 和 FF02:ABCD:: 都是子网广播地址。

  9. isMCSiteLocal()
    当IP地址是站点范围的广播地址时返回true,否则返回false。
    使用站点范围的广播地址,可以向站点范围内的计算机发送广播信息。
    IPv4的站点范围广播地址的范围是239.255.0.0 ~ 239.255.255.255,如239.255.1.1、239.255.0.0都是站点范围的广播地址。
    IPv6的站点范围广播地址的第一个字节是FF,第二个字节的范围是05 ~ F5,其他的字节可以是任意值,如FF05:: 和 FF45:: 都是站点范围的广播地址。

  10. isMCOrgLocal()
    当IP地址是组织范围的广播地址时返回ture,否则返回false。
    使用组织范围广播地址可以向公司或企业内部的所有的计算机发送广播信息。
    IPv4的组织范围广播地址的第一个字节是239,第二个字节不小于192,第三个字节不大于195,如239.193.100.200、239.192.195.0都是组织范围广播地址。
    IPv6的组织范围广播地址的第一个字节是FF,第二个字节的范围是08 ~ F8,其他的字节可以是任意值,如FF08:: 和 FF48::都是组织范围的广播地址。

可达性测试

//可以根据指定timeout时间内测试网络是否可达,是否可以建立连接。
public boolean isReachable(int timeout)
//可以指定从本机那个网卡、生存时间ttl 和指定时间来测试网络是否可达。
public boolean isReachable(NetworkInterface netif, int ttl, int timeout)

Inet4Address 和 Inet6Address

上面调用构造InetAddress,和获取一些信息,其实都是委托给Inet4Address或Inet6Address中的方法。

Paste_Image.png
从代码中可以看出,是根据ip地址字节数组长度来判断创建Inet4Address实例还是Inet6Address实例。

Inet4Address类结构图

本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8    
点击这里快速进入简书

GIT地址:http://git.oschina.net/brucekankan/
点击这里快速进入GIT

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152223.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • [精选]图文详解到底什么是三次握手四次挥手「建议收藏」

    [精选]图文详解到底什么是三次握手四次挥手

  • docker镜像操作_docker 本地镜像

    docker镜像操作_docker 本地镜像前言Docker的三大核心概念:镜像、容器、仓库。初学者对镜像和容器往往分不清楚,学过面向对象的应该知道类和实例,这跟面向对象里面的概念很相似我们可以把镜像看作类,把容器看作类实例化后的对象。|

  • java中线程安全的容器_jfinal容器线程安全吗

    java中线程安全的容器_jfinal容器线程安全吗四、线程安全的容器类Java编码中,我们经常需要用到容器来编程。在并发环境下,Java提供一些已有容器能够支持并发。1.Map在Map类中,提供两种线程安全容器。java.util.HashtableHashtable和HashMap类似,都是散列表,存储键值对映射。主要区别在于Hashtable是线程安全的。当我们查看Hashtable源码的时候,可以看到Hashtable的方法都是通过syn

  • pandas 读取excel文件

    pandas 读取excel文件pandas读取excel文件一read_excel()的基本用法二read_excel()的常用的参数:三示例1.IO:路径2.sheet_name:指定工作表名3.header:指定标题行4.names:指定列名5.index_col:指定列索引6.skiprows:跳过指定行数的数据7.skipfooter:省略从尾部的行数据8.dtype指定某些列的数据类型pandas读取excel文件使用的是read_excel方法。本文将详细解析read_excel方法

    2022年10月23日
  • hash表存储方式_哈希表与数据的存储结构有关吗

    hash表存储方式_哈希表与数据的存储结构有关吗HashSet集合的自身特点: *   1、底层数据结构:哈希表 *   2、存储,拿取都比较快 *   3、线程不安全,运行速度快代码实现如下:packageitcast.demo1;importjava.util.HashSet;/**HashSet集合的自身特点:* 底层数据结构:哈希表* 存储,拿取都比较快* 线…

  • wsus补丁服务器如何给自己打补丁(windows补丁服务器)

    WSUS,全称Windowsserverupdateservices,是微软在其网络结构中提供的关于系统补丁更新的一个解决方案,完全免费,现在最新的版本是WSUS3.0SP2,在生产环境中部署WSUS的应用价值主要是提高网络资源的利用率,节省带宽,同时对于客户端计算机来说呢,更新效率也更高一些。在日常大家都习惯了用第三方工具给系统打补丁,局域网的PC数量少了便罢,如果多于50台,只是给系统以及微软产品打补丁这一项工作对于网络资源的占用就不可小觑,在Windowsserver2003以前…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号