将字符串转换为InetAddress而无需进行DNS查找

25

我有一个用点分十进制表示的本地IP地址的 String。我想将其转换为InetAddress,以便将其提供给Socket,但我需要在不进行DNS查找的情况下完成(因为这可能会导致长时间的超时)。

是否有现成的方法可以做到这一点,还是我需要拆分String并从其字节创建InetAddress

更新 工厂方法 InetAddress.getByName()InetAddress.getByAddress() 看起来不太合适,因为它们都接受主机名,例如 java.sun.com。无法确定它们在实现中是否会尝试联系 DNS 服务器。


@Zelldon,同意。但我不想为了这个功能而使用整个库。 - Bart Friederichs
将一个表示 IP 的字符串转换为 InetAddress - Java。同样的问题。 - Zelldon
1
@Zelldon 是的,但是答案不同。我想要百分之百确定没有任何网络活动正在进行。 - Bart Friederichs
4个回答

29

这样做

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
根据Java文档,如果提供了正确的IP格式,则不进行DNS验证。参考 - http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html#getByName%28java.lang.String%29 - Prabhakaran Ramaswamy
5
源代码的含义与之相同:'如果主机是一个IP地址,我们不会进行进一步的查找'。 - Alexey Odintsov
1
在我的情况下,InetAddress address = InetAddress.getByName("www.sun.com"); 运行正常,但是当我给一个错误的主机地址作为参数,比如 ">>" rel = "nofollow noreferrer">www.sunqqq.com",它会抛出异常。>>> java.net.UnknownHostException: www.sunqqq.com at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) at java.net.InetAddress$1.lookupAllHostAddr(Unknown Source) at java.net.InetAddress.getAddressesFromNameService(Unknown Source) at java.net.InetAddress.getAllByName0(Unknown Source) at java.net.InetAddress.getAllByName(Unknown Source)....(更多) - Samitha Chathuranga
@SamithaChathuranga 除了IP格式之外,它还会进行DNS查找。在你的情况下,它将查找URL以获取IP地址,然后该URL未解析为任何IP地址,所以你会收到该异常。 - Prabhakaran Ramaswamy
@SamithaChathuranga 你知道192.168.0.105和www.sun.com之间的区别吗? - Prabhakaran Ramaswamy
显示剩余8条评论

7
你可以使用 Guava的 InetAddresses#forString(),它专门为你的用例提供了文档:

返回具有给定字符串表示形式的InetAddress
这会有意地避免所有名称服务查找(例如没有DNS)。

(强调添加)


1
你可以使用getByName方法来实现此操作。例如:
InetAddress localhost = InetAddress.getByName("127.0.0.1")

正如Java文档所描述:

主机名可以是机器名称,例如“java.sun.com”,也可以是其IP地址的文本表示。如果提供了文字IP地址,则仅检查地址格式的有效性。


1
在我的情况下,InetAddress address= InetAddress.getByName("www.sun.com"); 运行正确,但是当我给出错误的主机地址作为参数时,例如 "www.sunqqq.com",它会抛出异常。 >>> java.net.UnknownHostException: www.sunqqq.com at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) at java.net.InetAddress$1.lookupAllHostAddr(Unknown Source) at java.net.InetAddress.getAddressesFromNameService(Unknown Source) at java.net.InetAddress.getAllByName0(Unknown Source) at java.net.InetAddress.getAllByName(Unknown Source)....(更多) - Samitha Chathuranga
那么这是否意味着getByName()方法会进行DNS检查?因为似乎还检查了主机地址的有效性? - Samitha Chathuranga
是的,如果您向 getByName 提供主机名,它会执行 DNS 查找。但是,如果提供了 IP 地址,它只会检查 IP 的有效性(字符串格式)。 - Ali

0

开源IPAddress Java库将验证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
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接