在Java中有没有将字符串转换为InetAddress的简单方法?

31

我想将字符串转换成InetAddress。我不想解析主机名:这些字符串是IPv4地址。使用InetAddress.getByName(String host)可以吗?还是我需要手动解析它?

6个回答

26

com.google.common.net.InetAddresses.forString(String ipString)更适合此操作,因为它无论传入什么字符串,都不会进行DNS查找。


1
这是 Guava 的一部分。 - Matthew Flaschen
2
应该是 com.google.common.net.InetAddresses.forStringInetAddressesA要大写)。SO 不允许我在您的答案中进行更正,因为编辑必须至少为6个字符。;-)无论如何,谢谢,我正在寻找它,再次感谢 Guava 拯救了这一天。 - silmeth

14

是的,那会起作用。 API 很清楚地说明了这一点(“主机名可以是机器名称,例如“java.sun.com”,也可以是其 IP 地址的文本表示形式。”),当然您也可以轻松自行检查。


1
谢谢,我查了一下API,漏掉了那一行。 - TiansHUo
当主机是类似于192.168.0.*的模式时,会发生什么?那样会起作用吗?根据Inet4Address文档,似乎支持这种方式。 - Sebastian Hoffmann
@Paranaix,不会,它将抛出一个带有消息“无效的主机通配符规范”的IllegalArgumentException异常。 - Matthew Flaschen
7
特别是,文档中提到:“如果提供了一个字面上的 IP 地址,则仅检查地址格式的有效性。” 我的理解是:“如果指定了(点分十进制表示法)IP 地址,则不执行 DNS 查找”。 - Andre Holzner
1
OP说:“我不想解析主机名”;如果getByName()的输入不是有效的数字IP地址,但是是一个有效的可解析DNS名称,则该名称将被解析。这似乎不是OP想要的。 - Raedwald
@Raedwald,他还说“这些字符串是IPv4地址”。如果输入已知只包含IP地址,则这应该可以正常工作。 - Matthew Flaschen

3

注意:似乎解析无效地址(例如InetAddress.getByName("999.999.999.999")不会像文档中所述的那样抛出异常:

检查地址格式的有效性

实际上,我发现自己得到了一个InetAddress实例,其中本地机器的原始IP地址和无效的IP地址作为主机名。这当然不是我期望的结果!


4
从Java 7开始,这将会抛出一个UnknownHostException异常;我没有检查早期版本的Java,但我认为那里也会抛出异常。 - Craig Trader
@CraigTrader,但是如果您查看堆栈跟踪,您会发现这实际上不是解析异常,而是Java尝试将其作为主机名查找,这有点令人担忧。 - Marcono1234
因为999.999.999.999不是有效的IPv4地址,Java会请求系统的名称服务器将其解析为主机名。由于该IP地址没有有效的DNS条目,您将收到一个UnknownHostException异常。如果您使用有效的IPv4地址尝试此操作,则会得到一个有效的InetAddress对象。 - Craig Trader

1

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
      }

0
使用DNSJava库,您还可以解析它。
InetAddress address = Address.getByAddress(ipString)

没有外部调用,只需使用Address.toByteArray方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接