- 所有已实现的接口:
-
Serializable
- 直接已知的子类:
-
Inet4Address
,Inet6Address
IP地址是IP协议使用的32位或128位无符号数字,是UDP和TCP等协议构建在其上的较低级别协议。IP地址架构由RFC 790: Assigned Numbers, RFC 1918: Address Allocation for Private Internets,RFC 2365: Administratively Scoped IP Multicast和RFC 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表示“永久缓存”。
-
Method Summary
Modifier and TypeMethodDescriptionboolean
将此对象与指定对象进行比较。byte[]
返回此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
确定主机的IP地址,给定主机名。获取此IP地址的完全限定域名。返回文本表示的IP地址字符串。获取此IP地址的主机名。static InetAddress
返回本地主机的地址。static InetAddress
返回环回地址。int
hashCode()
返回此IP地址的哈希码。boolean
检查InetAddress是否是通配符地址的实用程序例程。boolean
检查InetAddress是否是链路本地地址的实用程序例程。boolean
检查InetAddress是否是环回地址的实用程序例程。boolean
检查组播地址是否具有全局范围的实用程序例程。boolean
检查组播地址是否具有链路范围的实用程序例程。boolean
检查组播地址是否具有节点范围的实用程序例程。boolean
检查组播地址是否具有组织范围的实用程序例程。boolean
检查多播地址是否具有站点范围的实用程序例程。boolean
检查InetAddress是否为IP多播地址的实用程序例程。boolean
isReachable
(int timeout) 测试地址是否可达。boolean
isReachable
(NetworkInterface netif, int ttl, int timeout) 测试地址是否可达。boolean
检查InetAddress是否为站点本地地址的实用程序例程。toString()
将此IP地址转换为String
。
-
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
测试地址是否可达。实现会尽最大努力尝试到达主机,但防火墙和服务器配置可能会阻止请求,导致不可达状态,而某些特定端口可能是可访问的。典型的实现将尝试使用ICMP ECHO REQUEST(如果可以获得权限),否则将尝试在目标主机的端口7(Echo)上建立TCP连接。超时值(以毫秒为单位)表示尝试应该花费的最长时间。如果操作在获得答案之前超时,则主机被视为不可达。负值将导致抛出IllegalArgumentException。
- 参数:
-
timeout
- 调用中止前的时间(以毫秒为单位) - 返回:
-
一个
boolean
,指示地址是否可达。 - 抛出:
-
IOException
- 如果发生网络错误 -
IllegalArgumentException
- 如果timeout
为负值。 - 自:
- 1.5
-
isReachable
测试地址是否可达。实现会尽最大努力尝试到达主机,但防火墙和服务器配置可能会阻止请求,导致不可达状态,而某些特定端口可能是可访问的。典型的实现将尝试使用ICMP ECHO REQUEST(如果可以获得权限),否则将尝试在目标主机的端口7(Echo)上建立TCP连接。network interface
和ttl
参数允许调用者指定测试将通过的网络接口和数据包应经过的最大跳数。对于ttl
的负值将导致抛出IllegalArgumentException。超时值(以毫秒为单位)表示尝试应该花费的最长时间。如果操作在获得答案之前超时,则主机被视为不可达。负值将导致抛出IllegalArgumentException。
- 参数:
-
netif
- 将进行测试的NetworkInterface,或对于任何接口为null -
ttl
- 尝试的最大跳数或默认值为0 -
timeout
- 调用中止前的时间(以毫秒为单位) - 返回:
-
一个
boolean
,指示地址是否可达。 - 抛出:
-
IllegalArgumentException
- 如果timeout
或ttl
为负值。 -
IOException
- 如果发生网络错误 - 自:
- 1.5
-
getHostName
获取此IP地址的主机名。如果此InetAddress是使用主机名创建的,则将记住并返回此主机名;否则,将执行反向名称查找,并根据系统配置的解析器返回结果。如果需要名称服务的查找,请调用
getCanonicalHostName
。如果存在安全管理器,将首先调用其
checkConnect
方法,参数为主机名和-1
,以查看是否允许该操作。如果不允许该操作,则将返回IP地址的文本表示形式。- 返回:
- 此IP地址的主机名,如果安全检查不允许该操作,则返回IP地址的文本表示形式。
- 参见:
-
getCanonicalHostName
获取此IP地址的完全限定域名。尽最大努力的方法,这意味着根据底层系统配置,我们可能无法返回FQDN。如果存在安全管理器,此方法首先调用其
checkConnect
方法,参数为主机名和-1
,以查看调用代码是否被允许知道此IP地址的主机名,即连接到主机。如果不允许该操作,则将返回IP地址的文本表示形式。- 返回:
- 此IP地址的完全限定域名,如果安全检查不允许该操作,则返回IP地址的文本表示形式。
- 自:
- 1.4
- 参见:
-
getAddress
public byte[] getAddress()返回此InetAddress
对象的原始IP地址。结果以网络字节顺序表示:地址的最高字节在getAddress()[0]
中。- 返回:
- 此对象的原始IP地址。
-
getHostAddress
以文本形式返回IP地址字符串。- 返回:
- 以字符串格式返回IP地址。
- 自:
- 1.0.2
-
hashCode
public int hashCode()返回此IP地址的哈希码。 -
equals
将此对象与指定对象进行比较。结果仅在参数不为null
且表示与此对象相同的IP地址时为true
。如果两个
InetAddress
实例的getAddress
返回的字节数组长度相同,并且每个数组组件对于两个字节数组都相同,则它们表示相同的IP地址。 -
toString
将此IP地址转换为String
。返回的字符串格式为:主机名 / 字面IP地址。如果主机名未解析,则不执行反向查找。主机名部分将由空字符串表示。 -
getByAddress
根据提供的主机名和IP地址创建一个InetAddress。不使用系统范围的解析器来检查地址的有效性。主机名可以是机器名,例如"
www.example.com
",或其IP地址的文本表示。主机名也不会进行有效性检查。
如果addr指定了IPv4地址,则将返回一个Inet4Address实例;否则将返回一个Inet6Address实例。
IPv4地址字节数组必须为4字节长,IPv6字节数组必须为16字节长
- 参数:
-
host
- 指定的主机 -
addr
- 以网络字节顺序表示的原始IP地址 - 返回:
- 从原始IP地址创建的InetAddress对象。
- 抛出:
-
UnknownHostException
- 如果IP地址长度非法 - 自:
- 1.4
-
getByName
给定主机的主机名,确定主机的IP地址。主机名可以是机器名,例如"
www.example.com
",或其IP地址的文本表示。如果提供了字面IP地址,则仅检查地址格式的有效性。对于在字面IPv6地址中指定的
host
,接受RFC 2732中定义的形式或RFC 2373中定义的字面IPv6地址格式。还支持IPv6范围地址。有关IPv6范围地址的描述,请参见此处。如果主机为
null
或host.length()
等于零,则返回表示回环接口地址的InetAddress。请参见RFC 3330第2节和RFC 2373第2.5.3节。如果存在安全管理器,并且
host
不为null
或host.length()
不等于零,则调用安全管理器的checkConnect
方法,参数为主机名和-1
,以确定是否允许该操作。- 参数:
-
host
- 指定的主机,或null
。 - 返回:
- 给定主机名的IP地址。
- 抛出:
-
UnknownHostException
- 如果找不到host
的IP地址,或者为全局IPv6地址指定了scope_id。 -
SecurityException
- 如果存在安全管理器并且其checkConnect方法不允许该操作 - 外部规范
-
getAllByName
给定主机名,根据配置的系统解析器返回其IP地址数组。主机名可以是机器名,例如"
www.example.com
",或其IP地址的文本表示。如果提供了字面IP地址,则仅检查地址格式的有效性。对于在字面IPv6地址中指定的
host
,接受RFC 2732中定义的形式或RFC 2373中定义的字面IPv6地址格式。字面IPv6地址还可以通过附加作用域区域标识符或scope_id进行限定。有关scope_id的语法和用法,请参见此处。如果主机为
null
或host.length()
等于零,则返回表示回环接口地址的InetAddress。请参见RFC 3330第2节和RFC 2373第2.5.3节。如果存在安全管理器,并且
host
不为null
或host.length()
不等于零,则调用安全管理器的checkConnect
方法,参数为主机名和-1
,以确定是否允许该操作。- 参数:
-
host
- 主机名,或null
。 - 返回:
- 给定主机名的所有IP地址的数组。
- 抛出:
-
UnknownHostException
- 如果找不到host
的IP地址,或者为全局IPv6地址指定了scope_id。 -
SecurityException
- 如果存在安全管理器并且其checkConnect
方法不允许该操作。 - 外部规范
- 参见:
-
getLoopbackAddress
返回回环地址。返回的InetAddress将表示IPv4回环地址127.0.0.1,或IPv6回环地址::1。返回的IPv4回环地址只是形式为127.*.*.*中的一个。
- 返回:
- InetAddress回环实例。
- 自:
- 1.7
-
getByAddress
给定原始IP地址,返回一个InetAddress
对象。参数以网络字节顺序表示:地址的最高位字节在getAddress()[0]
中。此方法不会阻塞,即不执行反向查找。
IPv4地址字节数组必须为4字节长,IPv6字节数组必须为16字节长
- 参数:
-
addr
- 以网络字节顺序表示的原始IP地址 - 返回:
- 从原始IP地址创建的InetAddress对象。
- 抛出:
-
UnknownHostException
- 如果IP地址长度非法 - 自:
- 1.4
-
getLocalHost
返回本地主机的地址。这是通过从系统中检索主机名,然后将该名称解析为InetAddress
来实现的。注意:解析的地址可能会被缓存一小段时间。
如果存在安全管理器,则将使用其
checkConnect
方法,参数为本地主机名和-1
,以查看是否允许该操作。如果不允许该操作,则返回表示回环地址的InetAddress。- 返回:
- 本地主机的地址。
- 抛出:
-
UnknownHostException
- 如果无法将本地主机名解析为地址。 - 参见:
-