【发布时间】:2011-01-19 12:35:58
【问题描述】:
我正在尝试将字符串转换为Inetaddress。我不是在尝试解析主机名:字符串是 ipv4 地址。 InetAddress.getByName(String host) 有效吗?还是我必须手动解析?
【问题讨论】:
标签: java string inetaddress
我正在尝试将字符串转换为Inetaddress。我不是在尝试解析主机名:字符串是 ipv4 地址。 InetAddress.getByName(String host) 有效吗?还是我必须手动解析?
【问题讨论】:
标签: java string inetaddress
com.google.common.net.InetAddresses.forString(String ipString) 对此更好,因为无论传递给它的字符串是什么,它都不会进行 DNS 查找。
【讨论】:
com.google.common.net.InetAddresses.forString(InetAddresses 带有大写 A)。所以不允许我在你的答案中更正它,因为编辑必须至少有 6 个字符。 ;-) 无论如何,谢谢,一直在寻找它,而番石榴再次拯救了这一天。
是的,这会起作用。 The API 对此非常清楚(“主机名可以是机器名,例如“java.sun.com”,也可以是其 IP 地址的文本表示。”),当然您可以轻松检查自己.
【讨论】:
IllegalArgumentException 并带有“无效的主机通配符规范”的消息
If a literal IP address is supplied, only the validity of the address format is checked.,我将其解读为:“如果您指定(点分四符号)IP 地址,则不执行 DNS 查找”。
getByName() 的输入不是有效的数字 IP 地址,而是有效的可解析 DNS 名称,则该名称将被解析。这似乎不是 OP 想要的。
注意:解析无效地址(例如InetAddress.getByName("999.999.999.999")似乎不会导致异常,正如人们可能从文档的短语中所期望的那样:
检查地址格式的有效性
根据经验,我发现自己获得了一个 InetAddress 实例,其中本地计算机的原始 IP 地址和无效 IP 地址作为主机名。这当然不是我所期望的!
【讨论】:
999.999.999.999 不是有效的 IPv4 地址,Java 要求系统的名称服务器将其解析为主机名。由于该 IP 地址没有有效的 DNS 条目,您将获得一个UnknownHostException。如果您使用有效的 IPv4 地址尝试此操作,您将获得有效的 InetAddress 对象。
您可以在将String 传递给getByName() 之前尝试using a regular expression to filter-out non-numeric IP addresses。那么getByName() 将不会尝试名称解析。
【讨论】:
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
}
【讨论】: