我正在尝试将字符串转换为Inetaddress
。我不是要解析主机名:字符串是ipv4地址。 InetAddress.getByName(String host)
有用吗?或者我是否必须手动解析它?
答案 0 :(得分:17)
com.google.common.net.InetAddresses.forString(String ipString)
对此更好,因为无论传递给它的是什么字符串都不会进行DNS查找。
答案 1 :(得分:14)
是的,那会有效。 The API非常明确(“主机名可以是机器名,例如”java.sun.com“,也可以是其IP地址的文本表示。”),当然你可以很容易检查自己。
答案 2 :(得分:3)
注意:似乎解析一个无效的地址,例如InetAddress.getByName("999.999.999.999"
)将不导致异常,正如人们可能从文档的短语中得到的那样:
检查地址格式的有效性
根据经验,我发现自己获得了一个InetAddress实例,其中包含本地计算机的原始IP地址和无效的IP地址作为主机名。当然这不是我的预期!
答案 3 :(得分:1)
在将String
传递给getByName()
之前,您可以尝试using a regular expression to filter-out non-numeric IP addresses。然后getByName()
将不会尝试解析名称。
答案 4 :(得分:0)
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
}