【问题标题】:Is there an easy way to convert String to Inetaddress in Java?有没有一种简单的方法可以在 Java 中将 String 转换为 Inetaddress?
【发布时间】:2011-01-19 12:35:58
【问题描述】:

我正在尝试将字符串转换为Inetaddress。我不是在尝试解析主机名:字符串是 ipv4 地址。 InetAddress.getByName(String host) 有效吗?还是我必须手动解析?

【问题讨论】:

    标签: java string inetaddress


    【解决方案1】:

    com.google.common.net.InetAddresses.forString(String ipString) 对此更好,因为无论传递给它的字符串是什么,它都不会进行 DNS 查找。

    【讨论】:

    • 这是部分of Guava
    • 它应该是com.google.common.net.InetAddresses.forStringInetAddresses 带有大写 A)。所以不允许我在你的答案中更正它,因为编辑必须至少有 6 个字符。 ;-) 无论如何,谢谢,一直在寻找它,而番石榴再次拯救了这一天。
    【解决方案2】:

    是的,这会起作用。 The API 对此非常清楚(“主机名可以是机器名,例如“java.sun.com”,也可以是其 IP 地址的文本表示。”),当然您可以轻松检查自己.

    【讨论】:

    • 谢谢,我查了api,没看到那行。
    • 什么时候主机是像 192.168.0.* 这样的模式?这也行吗?关于 Inet4Address 文档,似乎支持这一点。
    • @Paranaix,不,它会抛出一个 IllegalArgumentException 并带有“无效的主机通配符规范”的消息
    • 特别是,文档说:If a literal IP address is supplied, only the validity of the address format is checked.,我将其解读为:“如果您指定(点分四符号)IP 地址,则不执行 DNS 查找”。
    • OP 说“我没有尝试解析主机名”;如果getByName() 的输入不是有效的数字 IP 地址,而是有效的可解析 DNS 名称,则该名称将被解析。这似乎不是 OP 想要的。
    【解决方案3】:

    注意:解析无效地址(例如InetAddress.getByName("999.999.999.999")似乎不会导致异常,正如人们可能从文档的短语中所期望的那样:

    检查地址格式的有效性

    根据经验,我发现自己获得了一个 InetAddress 实例,其中本地计算机的原始 IP 地址和无效 IP 地址作为主机名。这当然不是我所期望的!

    【讨论】:

    • 从 Java 7 开始,这将引发 UnknownHostException;没有检查过早期的 Java,但我预计那里也会出现异常。
    • @CraigTrader,但是如果您查看堆栈跟踪,您会发现这实际上不是解析异常,但 Java 会尝试将其作为主机名查找,这有点令人担忧。
    • 因为999.999.999.999 不是有效的 IPv4 地址,Java 要求系统的名称服务器将其解析为主机名。由于该 IP 地址没有有效的 DNS 条目,您将获得一个UnknownHostException。如果您使用有效的 IPv4 地址尝试此操作,您将获得有效的 InetAddress 对象。
    【解决方案4】:

    您可以在将String 传递给getByName() 之前尝试using a regular expression to filter-out non-numeric IP addresses。那么getByName() 将不会尝试名称解析。

    【讨论】:

      【解决方案5】:

      The open-source IPAddress Java library 将验证 IPv6 和 IPv4 的所有标准表示,并且不会进行 DNS 查找。免责声明:我是该库的项目经理。

      以下代码将满足您的要求:

           String s = "1.2.3.4";
           try {
                  IPAddressString str = new IPAddressString(s);
                  IPAddress addr = str.toAddress();
                  InetAddress inetAddress = addr.toInetAddress(); //IPv4 or IPv6
                  if(addr.isIPv4() || addr.isIPv4Convertible()) {//IPv4 specific
                      IPv4Address ipv4Addr = addr.toIPv4();
                      Inet4Address inetAddr = ipv4Addr.toInetAddress();
                      //use address
                  }
            } catch(AddressStringException e) {
                  //e.getMessage has validation error
            }
      

      【讨论】:

        猜你喜欢
        • 2012-02-25
        • 1970-01-01
        • 2022-09-24
        • 2010-09-06
        • 1970-01-01
        • 2019-10-30
        • 1970-01-01
        • 1970-01-01
        • 2021-12-25
        相关资源
        最近更新 更多