我在String
中有点分十进制表示法的本地IP地址。我想将其转换为InetAddress
以将其转换为Socket
,但我需要在不进行DNS查找的情况下执行此操作(因为这可能会导致冗长的超时)。
是否有一个现成的方法,或者我是否需要拆分String
并从其字节创建InetAddress
?
更新工厂方法InetAddress.getByName()
和InetAddress.getByAddress()
似乎不太合适,因为它们都接受java.sun.com
等主机名。毫无疑问,他们是否会尝试在实施中联系DNS服务器。
答案 0 :(得分:23)
这样做
InetAddress inetAddress = InetAddress.getByName("192.168.0.105");
如果提供了文字IP地址,则仅提供地址的有效性 格式被检查。
java源代码
// if host is an IP address, we won't do further lookup if (Character.digit(host.charAt(0), 16) != -1 || (host.charAt(0) == ':')) { }
答案 1 :(得分:3)
您可以使用针对您的用例明确记录的Guava's InetAddresses#forString()
:
返回具有给定字符串表示的
InetAddress
这故意避免所有名称服务查找(例如没有DNS)。
(强调补充)
答案 2 :(得分:0)
您可以使用getByName方法执行此操作。例如:
InetAddress localhost = InetAddress.getByName("127.0.0.1")
正如java docs中描述的那样:
主机名可以是计算机名称,例如“java.sun.com”,也可以是其IP地址的文本表示形式。如果提供了文字IP地址,则仅检查地址格式的有效性。
答案 3 :(得分:0)
The open-source IPAddress Java library将验证IPv6和IPv4的所有标准表示,并且无需DNS查找即可验证。免责声明:我是该图书馆的项目经理。
以下代码将执行您的请求:
String str = "fe80:0:0:0:f06c:31b8:cd17:5a44";
try {
IPAddressString str = new IPAddressString(str);
IPAddress addr = str.toAddress();//throws if invalid, without a DNS lookup
InetAddress inetAddr = addr.toInetAddress();//convert valid address
//use address
} catch(AddressStringException e) {
//e.getMessage has validation error
}