【发布时间】:2012-04-14 19:08:42
【问题描述】:
我想检查一个字符串是 Java 中的主机名还是 IP 地址。是否有 API 可以做到这一点,还是我必须自己编写解析器?
问题很复杂,因为有 IPv4 地址、短 IPv6 地址和长 IPv6 地址、短主机名和 FQDN 主机名。
【问题讨论】:
标签: java string ip-address hostname
我想检查一个字符串是 Java 中的主机名还是 IP 地址。是否有 API 可以做到这一点,还是我必须自己编写解析器?
问题很复杂,因为有 IPv4 地址、短 IPv6 地址和长 IPv6 地址、短主机名和 FQDN 主机名。
【问题讨论】:
标签: java string ip-address hostname
在 JDK API 中不可能,但您可以在 google guava 中使用 InetAddresses.forString,当参数不是 IP 字符串文字时会引发异常。
【讨论】:
似乎没有API,但是编写这样的函数似乎不是很困难。您可以在代码中检查以下条件:
【讨论】:
虽然理论上您可以自己编写规则来处理这些情况,但使用 the usual cadre 或 RFCs,我会改为查看 the entirety of this class in Google Guava,尤其是极端情况,例如它如何解决嵌入 4-in-6 地址。
至于确定您是否有 FQDN,请查看强制 IP 地址是否失败,然后尝试针对 DNS 进行解析。考虑到您的输入情况,其他任何内容都应该是不完全限定的主机名或本地解析。
【讨论】:
The IPAddress Java library 会做到的。链接中提供了 javadoc。免责声明:我是项目经理。
static void check(HostName host) {
try {
host.validate();
if(host.isAddress()) {
System.out.println("address: " + host.asAddress());
} else {
System.out.println("host name: " + host);
}
} catch(HostNameException e) {
System.out.println(e.getMessage());
}
}
public static void main(String[] args) {
HostName host = new HostName("1.2.3.4");
check(host);
host = new HostName("1.2.a.4");
check(host);
host = new HostName("::1");
check(host);
host = new HostName("[::1]");
check(host);
host = new HostName("1.2.?.4");
check(host);
}
输出:
address: 1.2.3.4
host name: 1.2.a.4
address: ::1
address: ::1
1.2.?.4 Host error: invalid character at index 4
【讨论】:
要扩展 @MrGomez 的答案,请使用 InetAddresses 验证 IP 地址并使用 InternetDomainName 验证主机名 (FQDN)。
例子:
public static boolean validate(final String hostname) {
return InetAddresses.isUriInetAddress(hostname) || InternetDomainName.isValid(hostname);
}
【讨论】:
import sun.net.util.IPAddressUtil
IPAddressUtil.isIPv4LiteralAddress(addr)
IPAddressUtil.isIPv6LiteralAddress(addr)
【讨论】: