我正在使用sun.net.util.IPAddressUtil
包检查字符串是否包含有效的IPv4和IPv6地址。
代码段是: -
String ipv4addr="200";
if(IPAddressUtil.isIPv4LiteralAddress(ipv4addr))
{
System.out.println("valid ipv4 address");
}
else
{
System.out.println("not valid");
}
但对于诸如200和300之类的地址,它仍然说它是有效的IPv4地址,但实际上并非如此。 当我使用相同的包并使用以下方法检查IPV6地址时: -
String ipv6addr="200";
if(IPAddressUtil.isIPv6LiteralAddress(ipv6addr))
{
System.out.println("valid ipv6 address");
}
else
{
System.out.println("not valid");
}
我得到了正确的结果。但是,IPv4似乎没有工作,或者可能是我错误地使用它。请指导我。我不想使用正则表达式进行IPv4验证...
答案 0 :(得分:23)
您获得“有效”结果的原因是:200
是有效的IPv4地址。
请参阅计算机,IPv4地址只是一个32位数字。这些点完全是为了我们的方便,因为我们人类很难记住大的精确数字。但他们不必在那里;有关于如何解析地址的规则取决于它有多少部分。
当一个地址由一个数字组成时,它被认为是一个32位数字,每个字节是该数字的8位。如果您要将"200"
解析为IP地址,则它将等于0.0.0.200。同样,"2130706433"
相当于127.0.0.1。
当地址有两个部分如0.200(第一部分是第一个字节,第二部分是表示其他3个字节的24位数字),甚至0.0.200(前两个数字)时,也有标准是字节,最后一部分是16位,占用其他2个字节)。 “异常”格式是IP地址类时代的遗留物,但几乎所有必须解析地址的软件都会理解它们。 (例如,如果您弹出浏览器并转到http://1249739112
* 或甚至http://74.125.33128
* ,Google的主页就会出现。)
*请参阅可点击链接的评论。谢谢,“链接验证器”。 :P
有关详细信息,请参阅http://download.oracle.com/javase/6/docs/api/java/net/Inet4Address.html或http://www.perlmonks.org/?node_id=221512或http://en.wikipedia.org/wiki/IPv4#Address_representations。
Java也理解这些格式(和.net一样,以及任何体面的操作系统),并正确解析地址,无论它包含1,2,3或4个部分。
如果你想检查一个可能的地址实际上是“xxx.xxx.xxx.xxx”,那么你可能想要使用模式或使用认为32-的验证库来明确检查位数作为无效地址(即使它们有效)。不过我不打扰 - 如果你使用提供的查找功能,你可以接受任何标准格式的地址,它会起作用。
(所有这些混乱都会随着IPv6的变化而变化;格式更加严格,您不能只输入一些36位数字并期望它能够正常工作。但是平台仍然知道如何解析地址,你应该相信它会这样做。)
答案 1 :(得分:3)
查看Guava's InetAddresses
类,其中包含用于处理IP地址的静态实用程序方法。 (据我所知,它在幕后使用sun.net.util.IPAddressUtil
类。)
System.out.println(InetAddresses.isInetAddress("400")); // false
答案 2 :(得分:2)
答案 3 :(得分:1)
如果要验证字符串是否是有效的IP地址表示,org.apache.http.conn.util.InetAddressUtils的源代码使用这些正则表达式:
IPV4_PATTERN = Pattern.compile(
"^(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}$");
IPV6_STD_PATTERN = Pattern.compile(
"^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$");
IPV6_HEX_COMPRESSED_PATTERN = Pattern.compile(
"^((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)$");
答案 4 :(得分:0)
经过一个小小的研究后,我最终得到了类似的东西
public static boolean isValidIP4Address(String ipAddress) {
if (ipAddress.matches("^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$")) {
String[] groups = ipAddress.split("\\.");
for (int i = 0; i <= 3; i++) {
String segment = groups[i];
if (segment == null || segment.length() <= 0) {
return false;
}
int value = 0;
try {
value = Integer.parseInt(segment);
} catch (NumberFormatException e) {
return false;
}
if (value > 255) {
return false;
}
}
return true;
}
return false;
}
这对于简单的检查很好。
答案 5 :(得分:0)
该字符串是一种IPv4字符串格式,最初由BSD Unix中的aton_inet实用程序引入,并且一直持续到今天的各种Unix和Linux版本以及其他地方。
https://linux.die.net/man/3/inet_aton
The IPAddress Java library将进行验证,可以配置为支持aton_inet格式。链接中提供了javadoc。免责声明:我是项目经理。
验证地址是否有效,允许inet_aton样式:
String str = "200";
IPAddressString addrString = new IPAddressString(str);
try {
IPAddress addr = addrString.toAddress();
System.out.println("valid address: " + addr.toCanonicalString());
} catch(IPAddressStringException e) {
System.out.println(e.getMessage());
}
输出:
有效地址:0.0.0.200
验证地址是否有效,不允许使用inet_aton样式:
IPAddressStringParameters parameters = new
IPAddressStringParameters.Builder().allow_inet_aton(false).toParams();
addrString = new IPAddressString(str, parameters);
try {
IPAddress addr = addrString.toAddress();
System.out.println("valid address: " + addr.toCanonicalString());
} catch(IPAddressStringException e) {
System.out.println(e.getMessage());
}
输出:
200 IP地址错误:选项不允许少于四个段的IPv4地址