Module  java.base
软件包  java.net

Class InetAddress

  • All Implemented Interfaces:
    Serializable
    已知直接子类:
    Inet4AddressInet6Address


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

    IP地址是由IP使用的32位或128位无符号数字,构建UDP和TCP协议的低级协议。 IP地址结构由定义RFC 790: Assigned NumbersRFC 1918: Address Allocation for Private InternetsRFC 2365: Administratively Scoped IP Multicast ,并RFC 2373: IP Version 6 Addressing Architecture InetAddress的一个实例由一个IP地址和可能的相应主机名组成(取决于它是用主机名构造还是已经完成了反向主机名解析)。

    地址类型

    Description of unicast and multicast address types
    unicast An identifier for a single interface. A packet sent to a unicast address is delivered to the interface identified by that address.

    The Unspecified Address -- Also called anylocal or wildcard address. It must never be assigned to any node. It indicates the absence of an address. One example of its use is as the target of bind, which allows a server to accept a client connection on any interface, in case the server host has multiple interfaces.

    The unspecified address must not be used as the destination address of an IP packet.

    The Loopback Addresses -- This is the address assigned to the loopback interface. Anything sent to this IP address loops around and becomes IP input on the local host. This address is often used when testing a client.

    multicast An identifier for a set of interfaces (typically belonging to different nodes). A packet sent to a multicast address is delivered to all interfaces identified by that address.

    IP地址范围

    链路本地地址被设计为用于单个链路上的寻址,例如自动地址配置,邻居发现或当没有路由器存在时。

    站点本地地址被设计为用于在站点内部寻址,而不需要全局前缀。

    全球地址在互联网上是独一无二的。

    IP地址的文字表示

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

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

    有一个couple of System Properties影响如何使用IPv4和IPv6地址。

    主机名解析

    主机名称到IP地址解析是通过使用本地机器配置信息和网络命名服务(如域名系统(DNS)和网络信息服务(NIS))的组合来实现的。 所使用的特定命名服务是默认配置的本地机器。 对于任何主机名,返回其对应的IP地址。

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

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

    InetAddress缓存

    InetAddress类具有高速缓存以存储成功以及不成功的主机名解析。

    默认情况下,安装安全管理器时,为防止DNS欺骗攻击,主机名正确解决的结果永远被缓存。 当没有安装安全管理器时,默认的行为是缓存条目以获得有限的(实现依赖的)时间段。 不成功的主机名解析的结果被缓存很短的时间(10秒),以提高性能。

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

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

    networkaddress.cache.ttl
    Indicates the caching policy for successful name lookups from the name service. The value is specified as an integer to indicate the number of seconds to cache the successful lookup. The default setting is to cache for an implementation specific period of time.

    A value of -1 indicates "cache forever".

    networkaddress.cache.negative.ttl (default: 10)
    Indicates the caching policy for un-successful name lookups from the name service. The value is specified as an integer to indicate the number of seconds to cache the failure for un-successful lookups.

    A value of 0 indicates "never cache". A value of -1 indicates "cache forever".

    从以下版本开始:
    1.0
    另请参见:
    getByAddress(byte[])getByAddress(java.lang.String, byte[])getAllByName(java.lang.String)getByName(java.lang.String)getLocalHost()Serialized Form
    • 方法详细信息

      • 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()SecurityManager.checkConnect(java.lang.String, int)
      • getCanonicalHostName

        public String getCanonicalHostName​()
        获取此IP地址的完全限定域名。 最好的方法,意味着我们可能无法返回FQDN取决于底层的系统配置。

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

        结果
        该IP地址的完全限定域名,或者安全检查不允许操作时,该IP地址的文本表示。
        从以下版本开始:
        1.4
        另请参见:
        SecurityManager.checkConnect(java.lang.String, int)
      • getAddress

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

        public String getHostAddress​()
        返回文本显示中的IP地址字符串。
        结果
        原始IP地址为字符串格式。
        从以下版本开始:
        1.0.2
      • equals

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

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

        重写:
        equals中的 Object
        参数
        obj - 要比较的对象。
        结果
        true如果对象是一样的; 否则为false
        另请参见:
        getAddress()
      • toString

        public String toString​()
        将此IP地址转换为String 返回的字符串格式为:hostname / literal IP地址。 如果主机名未解决,则不执行反向名称服务查找。 主机名部分将用空字符串表示。
        重写:
        toStringObject
        结果
        该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对象。
        异常
        UnknownHostException - 如果IP地址是非法的长度
        从以下版本开始:
        1.4
      • getByName

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

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

        对于在文字IPv6地址中指定的host ,RFC 2732中定义的格式或RFC 2373中定义的文字IPv6地址格式被接受。 还支持IPv6作用域地址。 有关IPv6作用域的描述,请参见here

        如果主机为nullInetAddress表示环回接口地址的InetAddress RFC 3330第2节和RFC 2373第2.5.3节。

        参数
        host - 指定的主机,或 null
        结果
        给定主机名的IP地址。
        异常
        UnknownHostException - 如果没有找到 host IP地址,或者是否为全局IPv6地址指定了scope_id。
        SecurityException - 如果安全管理器存在,并且其checkConnect方法不允许操作
      • getAllByName

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

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

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

        如果主机是null则返回一个表示环回接口地址的InetAddress RFC 3330第2节和RFC 2373第2.5.3节。

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

        参数
        host - 主机的名称,或 null
        结果
        一个给定主机名的所有IP地址的数组。
        异常
        UnknownHostException - 如果没有找到 host IP地址,或者如果为全局IPv6地址指定了scope_id。
        SecurityException - 如果安全管理器存在,并且其 checkConnect方法不允许操作。
        另请参见:
        SecurityManager.checkConnect(java.lang.String, int)
      • 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 - 如果本地主机名无法解析为地址。
        另请参见:
        SecurityManager.checkConnect(java.lang.String, int)getByName(java.lang.String)