在没有DNS查找的情况下将String转换为InetAddress

时间:2013-12-11 12:44:48

标签: java ip-address

我在String中有点分十进制表示法的本地IP地址。我想将其转换为InetAddress以将其转换为Socket,但我需要在不进行DNS查找的情况下执行此操作(因为这可能会导致冗长的超时)。

是否有一个现成的方法,或者我是否需要拆分String并从其字节创建InetAddress

更新工厂方法InetAddress.getByName()InetAddress.getByAddress()似乎不太合适,因为它们都接受java.sun.com等主机名。毫无疑问,他们是否会尝试在实施中联系DNS服务器。

4 个答案:

答案 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
        }