30

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

4

5 回答 5

24

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

于 2012-06-15T16:28:53.880 回答
14

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

于 2010-02-22T05:45:03.470 回答
3

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

检查地址格式的有效性

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

于 2013-11-18T13:29:28.683 回答
1

您可以尝试在传递to之前使用正则表达式过滤掉非数字 IP 地址。然后不会尝试名称解析。StringgetByName()getByName()

于 2013-03-28T17:06:39.207 回答
0

开源 IPAddress Java 库将验证 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
      }
于 2017-12-18T02:27:12.350 回答