模块 java.base
 java.net

类 InetAddress

java.lang.Object
java.net.InetAddress
所有已实现的接口:
Serializable
已知子类:
Inet4Address , Inet6Address

public sealed class InetAddress extends Object implements Serializable permits Inet4Address , Inet6Address
此类表示 Internet 协议 (IP) 地址。

IP 地址是 IP 使用的 32 位或 128 位无符号数字,IP 是一种较低级别的协议,UDP 和 TCP 等协议基于该协议构建。 IP 地址架构由 RFC 790:分配的号码 RFC 1918:专用互联网的地址分配RFC 2365:管理范围内的 IP 多播RFC 2373:IP 版本 6 寻址架构 定义。 InetAddress 的一个实例由一个 IP 地址和可能的其对应的主机名组成(取决于它是否使用主机名构造或是否已经进行了反向主机名解析)。

地址类型

单播和多播地址类型的描述
地址类型 Description
单播 单个接口的标识符。发送到单播地址的数据包将传送到该地址标识的接口。

未指定的地址——也称为任何本地地址或通配符地址。它绝不能分配给任何节点。它表示没有地址。它的一个使用示例是作为绑定的目标,它允许服务在任何接口上接受客户端连接,以防服务主机有多个接口。

未指定address 不得用作 IP 数据包的目标地址。

环回地址——这是分配给环回接口的地址。发送到此 IP 地址的任何内容都会循环并成为本地主机上的 IP 输入。这个地址经常在测试客户端时使用。

组播 一组接口的标识符(通常属于不同的节点)。发送到多播地址的数据包将传送到该地址标识的所有接口。

IP地址范围

链接本地地址设计用于在单个链路上寻址,用于自动地址配置、邻居发现或没有路由器时。

Site-local地址旨在用于在不需要全局前缀的情况下在站点内部寻址。

全球的地址在互联网上是唯一的。

IP 地址的文本表示

IP 地址的文本表示是特定于地址族的。

IPv4地址格式请参考Inet4Address#format; IPv6地址格式请参考Inet6Address#format

几个系统属性 会影响 IPv4 和 IPv6 地址的使用方式。

主机名解析

InetAddress 类提供了将主机名解析为其 IP 地址的方法,反之亦然。实际决议委托给 InetAddress 解析器

主机名到 IP 地址的解析将主机名映射到 IP 地址。对于任何主机名,都会返回其对应的 IP 地址。

反向名称解析意味着对于任何 IP 地址,返回与 IP 地址关联的主机。

内置的 InetAddress 解析器实现通过使用本地机器配置信息和网络命名服务(例如域名系统 (DNS) 和轻量级目录访问协议)的组合来执行主机名到 IP 地址的解析,反之亦然。 LDAP)。内置解析器默认使用的特定命名服务取决于本地计算机的配置。

InetAddress 具有 InetAddress 解析器的服务提供者机制,允许使用自定义 InetAddress 解析器而不是内置实现。 InetAddressResolverProvider 是服务提供者类。它的 API 文档提供了有关此机制的所有详细信息。

Inet地址缓存

InetAddress 类有一个缓存来存储成功和不成功的主机名解析。

默认情况下,当安装安全管理器时,为了防止 DNS 欺骗攻击,肯定的主机名解析结果会被永久缓存。当未安装安全管理器时,默认行为是在有限(依赖于实现)时间段内缓存条目。主机名解析不成功的结果会缓存很短的时间(10 秒)以提高性能。

如果不需要默认行为,则可以将 Java 安全属性设置为不同的生存时间 (TTL) 值以进行积极缓存。同样,系统管理员可以在需要时配置不同的负缓存 TTL 值。

两个 Java 安全属性控制用于正负主机名解析缓存的 TTL 值:

networkaddress.cache.ttl
指示从名称服务成功查找名称的缓存策略。该值被指定为一个整数,以指示缓存成功查找的秒数。默认设置是缓存实现特定的时间段。

值 -1 表示“永远缓存”。

networkaddress.cache.negative.ttl(默认值:10)
指示来自名称服务的不成功名称查找的缓存策略。该值被指定为一个整数,以指示为不成功的查找缓存失败的秒数。

值 0 表示“从不缓存”。值 -1 表示“永远缓存”。

密封类层次结构图:
Sealed class hierarchy graph for InetAddressSealed class hierarchy graph for InetAddress
自从:
1.0
参见:
  • 方法详情

    • isMulticastAddress

      public boolean isMulticastAddress()
      检查 InetAddress 是否为 IP 多播地址的实用例程。
      返回:
      boolean 指示 InetAddress 是否为 IP 多播地址
      自从:
      1.1
    • isAnyLocalAddress

      public boolean isAnyLocalAddress()
      检查 InetAddress 是否为通配符地址的实用例程。
      返回:
      boolean 指示 InetAddress 是否为通配符地址。
      自从:
      1.4
    • isLoopbackAddress

      public boolean isLoopbackAddress()
      检查 InetAddress 是否为环回地址的实用例程。
      返回:
      boolean 指示 InetAddress 是否为环回地址;否则为假。
      自从:
      1.4
    • isLinkLocalAddress

      public boolean isLinkLocalAddress()
      用于检查 InetAddress 是否为链接本地地址的实用例程。
      返回:
      boolean 指示 InetAddress 是否为链接本地地址;如果地址不是链接本地单播地址,则为 false。
      自从:
      1.4
    • isSiteLocalAddress

      public boolean isSiteLocalAddress()
      检查 InetAddress 是否为站点本地地址的实用例程。
      返回:
      boolean 指示 InetAddress 是否为站点本地地址;如果地址不是站点本地单播地址,则为 false。
      自从:
      1.4
    • isMCGlobal

      public boolean isMCGlobal()
      检查多播地址是否具有全局范围的实用例程。
      返回:
      a boolean 指示地址是否为全局范围的多播地址,如果不是全局范围或不是多播地址则为 false
      自从:
      1.4
    • isMCNodeLocal

      public boolean isMCNodeLocal()
      检查多播地址是否具有节点范围的实用例程。
      返回:
      a boolean 指示地址是否是节点本地范围的多播地址,如果它不是节点本地范围或不是多播地址则为 false
      自从:
      1.4
    • isMCLinkLocal

      public boolean isMCLinkLocal()
      用于检查多播地址是否具有链接范围的实用例程。
      返回:
      a boolean 指示地址是否是链路本地范围的多播地址,如果它不是链路本地范围或不是多播地址则为 false
      自从:
      1.4
    • isMCSiteLocal

      public boolean isMCSiteLocal()
      检查多播地址是否具有站点范围的实用例程。
      返回:
      boolean 指示地址是否是站点本地范围的多播地址,如果它不是站点本地范围或不是多播地址,则为 false
      自从:
      1.4
    • isMCOrgLocal

      public boolean isMCOrgLocal()
      检查多播地址是否具有组织范围的实用例程。
      返回:
      boolean 指示地址是否是组织本地范围的多播地址,如果它不是组织本地范围或不是多播地址,则为 false
      自从:
      1.4
    • isReachable

      public boolean isReachable(int timeout) throws IOException
      测试该地址是否可达。实现会尽最大努力尝试访问主机,但防火墙和服务配置可能会阻止请求,导致无法访问状态,而某些特定端口可能可以访问。如果可以获得特权,典型的实现将使用 ICMP ECHO REQUEST,否则它将尝试在目标主机的端口 7 (Echo) 上建立 TCP 连接。

      超时值(以毫秒为单位)表示尝试应该花费的最长时间。如果操作在得到答案之前超时,则主机被视为无法访问。负值将导致抛出 IllegalArgumentException。

      参数:
      timeout - 呼叫中止前的时间(以毫秒为单位)
      返回:
      boolean 指示地址是否可达。
      抛出:
      IOException - 如果发生网络错误
      IllegalArgumentException - 如果 timeout 为负。
      自从:
      1.5
    • isReachable

      public boolean isReachable(NetworkInterface  netif, int ttl, int timeout) throws IOException
      测试该地址是否可达。实现会尽最大努力尝试访问主机,但防火墙和服务配置可能会阻止请求,导致无法访问状态,而某些特定端口可能可以访问。如果可以获得特权,典型的实现将使用 ICMP ECHO REQUEST,否则它将尝试在目标主机的端口 7 (Echo) 上建立 TCP 连接。

      network interfacettl 参数让调用者指定测试将通过哪个网络接口以及数据包应该通过的最大跳数。 ttl 的负值将导致抛出 IllegalArgumentException。

      超时值(以毫秒为单位)表示尝试应该花费的最长时间。如果操作在得到答案之前超时,则主机被视为无法访问。负值将导致抛出 IllegalArgumentException。

      参数:
      netif - 将通过其完成测试的 NetworkInterface,或者对于任何接口为 null
      ttl - 尝试的最大跳数或默认为 0
      timeout - 呼叫中止前的时间(以毫秒为单位)
      返回:
      boolean 指示地址是否可达。
      抛出:
      IllegalArgumentException - 如果 timeoutttl 为负。
      IOException - 如果发生网络错误
      自从:
      1.5
    • getHostName

      public String  getHostName()
      获取此 IP 地址的主机名。

      如果这个 InetAddress 是用主机名创建的,这个主机名将被记住并返回;否则,将执行反向名称查找,并根据系统配置的解析器返回结果。如果需要查找名称服务,请调用 getCanonicalHostName

      如果有安全管理器,它的 checkConnect 方法首先以主机名和 -1 作为参数调用,以查看是否允许该操作。如果不允许该操作,它将返回 IP 地址的文本表示。

      返回:
      此 IP 地址的主机名,或者如果安全检查不允许该操作,则为IP 地址的文本表示。
      参见:
    • getCanonicalHostName

      public String  getCanonicalHostName()
      获取此 IP 地址的完全限定域名。尽力而为法,这意味着我们可能无法根据底层系统配置返回 FQDN。

      如果有安全管理器,该方法首先以主机名和-1 作为参数调用其checkConnect 方法,以查看是否允许调用代码知道此IP 地址的主机名,即连接到主机。如果不允许该操作,它将返回 IP 地址的文本表示。

      返回:
      此 IP 地址的完全限定域名,或者如果安全检查不允许该操作,则 IP 地址的文本表示。
      自从:
      1.4
      参见:
    • getAddress

      public byte[] getAddress()
      返回此 InetAddress 对象的原始 IP 地址。结果按网络字节顺序排列:地址的最高位字节在 getAddress()[0] 中。
      返回:
      此对象的原始 IP 地址。
    • getHostAddress

      public String  getHostAddress()
      以文本形式返回 IP 地址字符串。
      返回:
      字符串格式的原始 IP 地址。
      自从:
      1.0.2
    • hashCode

      public int hashCode()
      返回此 IP 地址的哈希码。
      重写:
      hashCode 在类 Object
      返回:
      此 IP 地址的哈希码值。
      参见:
    • equals

      public boolean equals(Object  obj)
      将此对象与指定对象进行比较。结果是 true 当且仅当参数不是 null 并且它表示与此对象相同的 IP 地址。

      如果 getAddress 返回的字节数组的长度对于两个实例都相同,并且字节数组的每个数组组件都相同,则 InetAddress 的两个实例表示相同的 IP 地址。

      重写:
      equals 在类 Object
      参数:
      obj - 要比较的对象。
      返回:
      true 如果对象相同; false否则。
      参见:
    • toString

      public String  toString()
      将此 IP 地址转换为 String 。返回的字符串的形式为:主机名/文字 IP 地址。如果主机名未解析,则不执行反向查找。主机名部分将由空字符串表示。
      重写:
      toString 在类 Object
      返回:
      此 IP 地址的字符串表示形式。
    • getByAddress

      public static InetAddress  getByAddress(String  host, byte[] addr) throws UnknownHostException
      根据提供的主机名和 IP 地址创建 InetAddress。系统范围的 解析器 不用于检查地址的有效性。

      主机名可以是机器名,例如“www.example.com”,也可以是其 IP 地址的文本表示。

      也不对主机名进行有效性检查。

      如果 addr 指定一个 IPv4 地址,将返回一个 Inet4Address 实例;否则,将返回 Inet6Address 的实例。

      IPv4 地址字节数组必须是 4 个字节长,IPv6 字节数组必须是 16 个字节长

      参数:
      host - 指定主机
      addr - 网络字节顺序的原始 IP 地址
      返回:
      从原始 IP 地址创建的 InetAddress 对象。
      抛出:
      UnknownHostException - 如果 IP 地址的长度非法
      自从:
      1.4
    • getByName

      public static InetAddress  getByName(String  host) throws UnknownHostException
      根据主机名确定主机的 IP 地址。

      主机名可以是机器名,例如“www.example.com”,也可以是其 IP 地址的文本表示。如果提供文字 IP 地址,则仅检查地址格式的有效性。

      对于在文字 IPv6 地址中指定的 host,接受 RFC 2732 中定义的格式或 RFC 2373 中定义的文字 IPv6 地址格式。还支持 IPv6 范围地址。有关 IPv6 范围地址的说明,请参阅 这里

      如果主机是 nullhost.length() 等于零,则返回表示环回接口地址的 InetAddress。请参见RFC 3330第 2 节和RFC 2373第 2.5.3 节。

      如果存在安全管理器,并且 host 不是 nullhost.length() 不等于零,则调用安全管理器的 checkConnect 方法,并以主机名和 -1 作为参数来确定是否允许该操作。

      参数:
      host - 指定的主机,或 null
      返回:
      给定主机名的 IP 地址。
      抛出:
      UnknownHostException - 如果找不到 host 的 IP 地址,或者如果为全球 IPv6 地址指定了 scope_id。
      SecurityException - 如果安全管理器存在并且其 checkConnect 方法不允许该操作
    • getAllByName

      public static InetAddress [] getAllByName(String  host) throws UnknownHostException
      给定主机名,根据配置的系统 解析器 返回其 IP 地址数组。

      主机名可以是机器名,例如“www.example.com”,也可以是其 IP 地址的文本表示。如果提供文字 IP 地址,则仅检查地址格式的有效性。

      对于 host 中指定文字 IPv6 地址接受 RFC 2732 中定义的形式或 RFC 2373 中定义的文字 IPv6 地址格式。文字 IPv6 地址也可以通过附加范围区域标识符或 scope_id 来限定。 这里 描述了 scope_ids 的语法和用法。

      如果主机是 nullhost.length() 等于零,则返回表示环回接口地址的 InetAddress。请参见RFC 3330第 2 节和RFC 2373第 2.5.3 节。

      如果存在安全管理器,并且 host 不是 nullhost.length() 不等于零,则调用安全管理器的 checkConnect 方法,并以主机名和 -1 作为参数来确定是否允许该操作。

      参数:
      host - 主机名,或 null
      返回:
      给定主机名的所有 IP 地址的数组。
      抛出:
      UnknownHostException - 如果找不到 host 的 IP 地址,或者如果为全球 IPv6 地址指定了 scope_id。
      SecurityException - 如果安全管理器存在且其 checkConnect 方法不允许该操作。
      参见:
    • getLoopbackAddress

      public static InetAddress  getLoopbackAddress()
      返回环回地址。

      返回的 InetAddress 将表示 IPv4 环回地址 127.0.0.1 或 IPv6 环回地址 ::1。返回的 IPv4 环回地址只是 127.*.*.* 形式的众多地址之一

      返回:
      InetAddress 环回实例。
      自从:
      1.7
    • getByAddress

      public static InetAddress  getByAddress(byte[] addr) throws UnknownHostException
      返回给定原始 IP 地址的 InetAddress 对象。参数按网络字节顺序排列:地址的最高位字节在 getAddress()[0] 中。

      该方法不阻塞,即不执行反向查找。

      IPv4 地址字节数组必须是 4 个字节长,IPv6 字节数组必须是 16 个字节长

      参数:
      addr - 网络字节顺序的原始 IP 地址
      返回:
      从原始 IP 地址创建的 InetAddress 对象。
      抛出:
      UnknownHostException - 如果 IP 地址的长度非法
      自从:
      1.4
    • getLocalHost

      public static InetAddress  getLocalHost() throws UnknownHostException
      返回本地主机的地址。这是通过从系统中检索主机名,然后将该名称解析为 InetAddress 来实现的。

      注意:解析后的地址可能会被缓存一小段时间。

      如果有安全管理器,则以本地主机名和-1作为参数调用其checkConnect方法,以查看是否允许该操作。如果不允许该操作,则返回一个代表环回地址的 InetAddress。

      返回:
      本地主机的地址。
      抛出:
      UnknownHostException - 如果本地主机名无法解析为地址。
      参见: