阅读(1451) (0)

鸿蒙OS InetAddress

2022-06-06 16:29:55 更新

InetAddress

java.lang.Object

|---java.net.InetAddress

public class InetAddress
extends Object
implements Serializable

此类表示 Internet 协议 (IP) 地址。

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

地址类型 IP 地址范围

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

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

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

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

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

主机名解析 主机名到 IP 地址的解析是通过结合使用本地机器配置信息和网络命名服务(例如域名系统 (DNS) 和网络信息服务 (NIS))来完成的。 默认情况下,正在使用的特定命名服务是本地计算机配置的服务。 对于任何主机名,都会返回其对应的 IP 地址。

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

InetAddress 类提供将主机名解析为其 IP 地址的方法,反之亦然。

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

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

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

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

networkaddress.cache.ttl

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

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

networkaddress.cache.negative.ttl (默认值:10)

指示来自名称服务的不成功名称查找的缓存策略。 该值指定为整数,以指示缓存不成功查找失败的秒数。

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

方法总结

修饰符和类型 方法 描述
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() 返回本地主机的地址。
static InetAddress getLoopbackAddress() 返回环回地址。
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 地址转换为字符串。
从类 java.lang.Object 继承的方法
clone, finalize, getClass, notify, notifyAll, wait, wait, wait

方法详情

isMulticastAddress

public boolean isMulticastAddress()

检查 InetAddress 是否为 IP 多播地址的实用程序。

返回:

一个布尔值,指示 InetAddress 是否为 IP 多播地址

isAnyLocalAddress

public boolean isAnyLocalAddress()

检查 InetAddress 是否在通配符地址中的实用程序。

返回:

一个布尔值,指示 Inetaddress 是否为通配符地址。

isLoopbackAddress

public boolean isLoopbackAddress()

检查 InetAddress 是否为环回地址的实用程序。

返回:

一个布尔值,指示 InetAddress 是否为环回地址; 否则为假。

isLinkLocalAddress

public boolean isLinkLocalAddress()

检查 InetAddress 是否为链接本地地址的实用程序。

返回:

一个布尔值,指示 InetAddress 是否是链接本地地址; 如果地址不是链接本地单播地址,则为 false。

isSiteLocalAddress

public boolean isSiteLocalAddress()

检查 InetAddress 是否为站点本地地址的实用程序例程。

返回:

一个布尔值,指示 InetAddress 是否是站点本地地址; 如果地址不是站点本地单播地址,则为 false。

isMCGlobal

public boolean isMCGlobal()

检查多播地址是否具有全局范围的实用程序。

返回:

一个布尔值,指示地址是否是全局范围的多播地址,如果不是全局范围或不是多播地址,则为 false

isMCNodeLocal

public boolean isMCNodeLocal()

检查多播地址是否具有节点范围的实用程序。

返回:

一个布尔值,指示地址是否是节点本地范围的多播地址,如果它不是节点本地范围或不是多播地址,则为 false

isMCLinkLocal

public boolean isMCLinkLocal()

检查多播地址是否具有链接范围的实用程序。

返回:

一个布尔值,指示地址是否是链路本地范围的多播地址,如果不是链路本地范围或不是多播地址,则为 false

isMCSiteLocal

public boolean isMCSiteLocal()

检查多播地址是否具有站点范围的实用程序。

返回:

一个布尔值,指示地址是否是站点本地范围的多播地址,如果它不是站点本地范围或不是多播地址,则为 false

isMCOrgLocal

public boolean isMCOrgLocal()

检查多播地址是否具有组织范围的实用程序。

返回:

一个布尔值,指示地址是否是组织本地范围的多播地址,如果它不是组织本地范围或不是多播地址,则为 false

isReachable

public boolean isReachable(int timeout) throws IOException

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

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

参数:

参数名称 参数描述
timeout 呼叫中止之前的时间(以毫秒为单位)

返回:

一个布尔值,指示地址是否可达。

Throws:

Throw名称 Throw描述
IOException 如果发生网络错误
IllegalArgumentException 如果超时为负。

isReachable

public boolean isReachable(NetworkInterface netif, int ttl, int timeout) throws IOException

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

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

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

参数:

参数名称 参数描述
netif 将通过其完成测试的 NetworkInterface,或者对于任何接口为 null
ttl 要尝试的最大跳数或默认值为 0
timeout 呼叫中止之前的时间(以毫秒为单位)

返回:

一个布尔值,指示地址是否可达。

Throws:

Throw名称 Throw描述
IllegalArgumentException 如果 timeout 或 ttl 为负数。
IOException 如果发生网络错误

getHostName

public String getHostName()

获取此 IP 地址的主机名。

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

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

返回:

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

getCanonicalHostName

public String getCanonicalHostName()

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

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

返回:

此 IP 地址的完全限定域名,或者如果安全检查不允许该操作,则为 IP 地址的文本表示。

getAddress

public byte[] getAddress()

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

返回:

此对象的原始 IP 地址。

getHostAddress

public String getHostAddress()

以文本形式返回 IP 地址字符串。

返回:

字符串格式的原始 IP 地址。

hashCode

public int hashCode()

返回此 IP 地址的哈希码。

覆盖:

类 Object 中的 hashCode

返回:

此 IP 地址的哈希码值。

equals

public boolean equals(Object obj)

将此对象与指定对象进行比较。 当且仅当参数不为 null 并且它表示与此对象相同的 IP 地址时,结果才为真。

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

覆盖:

类 Object 中的等于

参数:

参数名称 参数描述
obj 要比较的对象。

返回:

如果对象相同,则为 true; 否则为false。

toString

public String toString()

将此 IP 地址转换为字符串。 返回的字符串格式为:主机名/文字 IP 地址。 如果主机名未解析,则不执行反向名称服务查找。 主机名部分将由一个空字符串表示。

覆盖:

类 Object 中的 toString

返回:

此 IP 地址的字符串表示形式。

getByAddress

public static InetAddress getByAddress(String host, byte[] addr) throws UnknownHostException

根据提供的主机名和 IP 地址创建 InetAddress。 不检查名称服务的地址有效性。

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

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

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

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

参数:

参数名称 参数描述
host 指定的主机
addr 网络字节顺序的原始 IP 地址

返回:

从原始 IP 地址创建的 InetAddress 对象。

Throws:

Throw名称 Throw描述
UnknownHostException 如果 IP 地址的长度非法

getByName

public static InetAddress getByName(String host) throws UnknownHostException

给定主机名,确定主机的 IP 地址。

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

对于以文字 IPv6 地址指定的主机,接受 RFC 2732 中定义的格式或 RFC 2373 中定义的文字 IPv6 地址格式。 还支持 IPv6 范围地址。

如果主机为空,则返回表示环回接口地址的 InetAddress。

参数:

参数名称 参数描述
host 指定的主机,或者为空。

返回:

给定主机名的 IP 地址。

Throws:

Throw名称 Throw描述
UnknownHostException 如果找不到主机的 IP 地址,或者为全局 IPv6 地址指定了 scope_id。
SecurityException 如果存在安全管理器并且其 checkConnect 方法不允许该操作

getAllByName

public static InetAddress[] getAllByName(String host) throws UnknownHostException

给定主机的名称,根据系统上配置的名称服务返回其 IP 地址的数组。

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

对于以文字 IPv6 地址指定的主机,接受 RFC 2732 中定义的格式或 RFC 2373 中定义的文字 IPv6 地址格式。文字 IPv6 地址也可以通过附加作用域区域标识符或 scope_id 来限定。此处描述了 scope_ids 的语法和用法。

如果主机为空,则返回表示环回接口地址的 InetAddress。

如果存在安全管理器且主机不为空且 host.length() 不等于 0,则使用主机名和 -1 作为其参数调用安全管理器的 checkConnect 方法,以查看是否允许操作。

参数:

参数名称 参数描述
host 主机名,或为空。

返回:

给定主机名的所有 IP 地址的数组。

Throws:

Throw名称 Throw描述
UnknownHostException 如果找不到主机的 IP 地址,或者为全局 IPv6 地址指定了 scope_id。
SecurityException 如果存在安全管理器并且其 checkConnect 方法不允许该操作。

getLoopbackAddress

public static InetAddress getLoopbackAddress()

返回环回地址。

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

返回:

InetAddress 环回实例。

getByAddress

public static InetAddress getByAddress(byte[] addr) throws UnknownHostException

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

此方法不会阻塞,即不执行反向名称服务查找。

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

参数:

参数名称 参数描述
addr 网络字节顺序的原始 IP 地址

返回:

从原始 IP 地址创建的 InetAddress 对象。

Throws:

Throw名称 Throw描述
UnknownHostException 如果 IP 地址的长度非法

getLocalHost

public static InetAddress getLocalHost() throws UnknownHostException

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

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

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

返回:

本地主机的地址。

Throws:

Throw名称 Throw描述
UnknownHostException 如果本地主机名无法解析为地址。