我想将字符串转换成InetAddress
。我不想解析主机名:这些字符串是IPv4地址。使用InetAddress.getByName(String host)
可以吗?还是我需要手动解析它?
我想将字符串转换成InetAddress
。我不想解析主机名:这些字符串是IPv4地址。使用InetAddress.getByName(String host)
可以吗?还是我需要手动解析它?
com.google.common.net.InetAddresses.forString(String ipString)
更适合此操作,因为它无论传入什么字符串,都不会进行DNS查找。
是的,那会起作用。 API 很清楚地说明了这一点(“主机名可以是机器名称,例如“java.sun.com”,也可以是其 IP 地址的文本表示形式。”),当然您也可以轻松自行检查。
getByName()
的输入不是有效的数字IP地址,但是是一个有效的可解析DNS名称,则该名称将被解析。这似乎不是OP想要的。 - Raedwald注意:似乎解析无效地址(例如InetAddress.getByName("999.999.999.999"
)不会像文档中所述的那样抛出异常:
检查地址格式的有效性
实际上,我发现自己得到了一个InetAddress实例,其中本地机器的原始IP地址和无效的IP地址作为主机名。这当然不是我期望的结果!
999.999.999.999
不是有效的IPv4地址,Java会请求系统的名称服务器将其解析为主机名。由于该IP地址没有有效的DNS条目,您将收到一个UnknownHostException
异常。如果您使用有效的IPv4地址尝试此操作,则会得到一个有效的InetAddress
对象。 - Craig Trader开源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
}
InetAddress address = Address.getByAddress(ipString)
Address.toByteArray
方法。
com.google.common.net.InetAddresses.forString
(InetAddresses
的A
要大写)。SO 不允许我在您的答案中进行更正,因为编辑必须至少为6个字符。;-)无论如何,谢谢,我正在寻找它,再次感谢 Guava 拯救了这一天。 - silmeth