Module java.base
Package java.net

Class InetAddress

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

public sealed class InetAddress extends Object implements Serializable permits Inet4Address, Inet6Address
这个类表示一个互联网协议(IP)地址。

IP地址是IP协议使用的32位或128位无符号数字,是UDP和TCP等协议构建在其上的较低级别协议。IP地址架构由RFC 790: Assigned Numbers RFC 1918: Address Allocation for Private InternetsRFC 2365: Administratively Scoped IP MulticastRFC 2373: IP Version 6 Addressing Architecture定义。InetAddress的一个实例由一个IP地址和可能的对应主机名(取决于是否使用主机名构造或是否已经执行了反向主机名解析)组成。

地址类型

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

未指定地址 -- 也称为任意本地地址或通配符地址。绝不能分配给任何节点。它表示没有地址。其一种用法是作为绑定的目标,允许服务器在主机具有多个接口的情况下接受客户端连接。

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

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

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

IP地址范围

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

站点本地地址设计用于在站点内部进行寻址,无需全局前缀。

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

IP地址的文本表示

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

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

有一些系统属性影响IPv4和IPv6地址的使用。

主机名解析

InetAddress类提供了将主机名解析为其IP地址及反之的方法。实际解析被委托给一个InetAddress解析器

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

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

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

InetAddress具有用于InetAddress解析器的服务提供程序机制,允许使用自定义InetAddress解析器而不是内置实现。InetAddressResolverProvider是服务提供程序类。其API文档提供了有关此机制的所有细节。

InetAddress缓存

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

默认情况下,当安装了安全管理器时,为了防止DNS欺骗攻击,正面主机名解析的结果将永久缓存。当未安装安全管理器时,默认行为是缓存条目一段有限的时间(实现相关)。不成功的主机名解析的结果将缓存一段非常短的时间(10秒)以提高性能。

如果不希望使用默认行为,则可以设置Java安全属性以获得不同的正面缓存的存活时间(TTL)值。同样,系统管理员可以在需要时配置不同的负面缓存TTL值或扩展过时数据的使用。

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

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

值为-1表示“永久缓存”。

networkaddress.cache.stale.ttl
指示过时名称的缓存策略。该值指定为整数,表示过时名称将在缓存中保留的秒数。如果TTL已过期并且再次尝试查找主机名失败,则该名称被视为过时。如果更喜欢使用过时名称而不是由于查找失败而失败,则此属性很有用。默认设置是缓存一段特定的时间。

如果此属性的值大于“networkaddress.cache.ttl”,则“networkaddress.cache.ttl”将用作缓存中名称的刷新间隔。例如,如果此属性设置为1天,而“networkaddress.cache.ttl”设置为30秒,则正面响应将被缓存1天,但每30秒将尝试刷新它。

值为0(零)或未设置表示不使用过时名称。负值将被忽略。

networkaddress.cache.negative.ttl(默认值:10)
指示从名称服务中未成功查找的缓存策略。该值指定为整数,表示未成功查找的失败将在缓存中保留的秒数。

值为0表示“永不缓存”。值为-1表示“永久缓存”。

封闭类层次结构图:
InetAddress的封闭类层次结构图InetAddress的封闭类层次结构图
自版本:
1.0
外部规范
参见:
  • Method Details

    • 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是否为回环地址;否则为false。
      自:
      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()
      检查多播地址是否具有全局范围的实用程序例程。
      返回:
      一个boolean,指示地址是否为全局范围的多播地址,如果不是全局范围或不是多播地址,则为false。
      自:
      1.4
    • isMCNodeLocal

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

      public boolean isMCLinkLocal()
      检查多播地址是否具有链路范围的实用程序例程。
      返回:
      一个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。

      如果存在安全管理器,此方法首先调用其checkConnect方法,参数为主机名和-1,以查看调用代码是否被允许知道此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)
      将此对象与指定对象进行比较。结果仅在参数不为null且表示与此对象相同的IP地址时为true

      如果两个InetAddress实例的getAddress返回的字节数组长度相同,并且每个数组组件对于两个字节数组都相同,则它们表示相同的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地址,则仅检查地址格式的有效性。

      对于在字面IPv6地址中指定的host,接受RFC 2732中定义的形式或RFC 2373中定义的字面IPv6地址格式。字面IPv6地址还可以通过附加作用域区域标识符或scope_id进行限定。有关scope_id的语法和用法,请参见此处

      如果主机为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来实现的。

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

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

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