Java实现生成IPv4地址并判断其合法性
作者:爱码少年 00fly.online
IPv4地址是什么
IPv4地址(Internet Protocol version 4)是互联网协议第四版的网络地址,用于唯一标识连接到网络的设备。它由32位二进制数组成,通常以点分十进制表示,即4个8位二进制数(每个范围0-255),中间用点分隔,例如 192.168.1.1。
IPv4地址的结构
总长度:32位(4字节)
表示形式:A.B.C.D,其中每个字母是一个0~255的十进制整数
地址数量:理论上约43亿个(2^32)
分类
A类:1.0.0.0 ~ 126.255.255.255(首位0)
B类:128.0.0.0 ~ 191.255.255.255(首位10)
C类:192.0.0.0 ~ 223.255.255.255(首位110)
D类(组播):224.0.0.0 ~ 239.255.255.255(首位1110)
E类(保留):240.0.0.0 ~ 255.255.255.255(首位1111)
特殊地址
0.0.0.0:表示本机所有网络接口
127.0.0.1:本地回环地址(localhost)
255.255.255.255:广播地址
私有地址(用于局域网):
- 10.0.0.0 ~ 10.255.255.255
- 172.16.0.0 ~ 172.31.255.255
- 192.168.0.0 ~ 192.168.255.255
Java生成IPv4地址
方法一:生成任意公网地址(排除私有地址和特殊地址)
import java.util.Random;
public class RandomIPv4Generator {
private static final Random random = new Random();
// 生成一个0~255之间的随机整数
private static int randomOctet() {
return random.nextInt(256);
}
// 生成完全随机的IPv4地址(可能包含私有、广播等)
public static String randomIPv4() {
return randomOctet() + "." + randomOctet() + "." +
randomOctet() + "." + randomOctet();
}
// 生成公网可路由的IPv4地址(排除私有、回环、广播、多播等)
public static String randomPublicIPv4() {
int first;
do {
first = randomOctet();
} while (isPrivateOrSpecial(first));
return first + "." + randomOctet() + "." +
randomOctet() + "." + randomOctet();
}
private static boolean isPrivateOrSpecial(int first) {
// 排除私有地址段: 10.x.x.x, 172.16-31.x.x, 192.168.x.x
if (first == 10) return true;
if (first == 172) {
int second = random.nextInt(256); // 实际判断需要调用时传入second
// 简化为只要第一段是172就跳过(更精确需判断第二段16-31)
return true;
}
if (first == 192) {
int second = random.nextInt(256);
// 简化判断:只要第一段192且第二段168则跳过
return true;
}
// 回环127.x.x.x, 广播255.x.x.x, 多播224-239.x.x.x, 保留240-255
if (first == 127 || first == 255 || (first >= 224 && first <= 255)) {
return true;
}
return false;
}
}更精确的公网地址生成示例(使用循环重试直到生成合法公网地址):
public static String generatePublicIPv4() {
Random rand = new Random();
while (true) {
int a = rand.nextInt(256);
// 排除私有和保留段
if (a == 10) continue;
if (a == 127) continue;
if (a == 172) {
int b = rand.nextInt(256);
if (b >= 16 && b <= 31) continue;
}
if (a == 192) {
int b = rand.nextInt(256);
if (b == 168) continue;
}
if (a == 255) continue;
if (a >= 224 && a <= 255) continue;
int b = rand.nextInt(256);
int c = rand.nextInt(256);
int d = rand.nextInt(256);
return a + "." + b + "." + c + "." + d;
}
}方法二:生成指定范围内的IPv4地址(如C段)
public static String randomCClass(String prefix) {
// prefix 例如 "192.168.1"
return prefix + "." + random.nextInt(256);
}Java判断IPv4地址合法性
方法一:正则表达式
import java.util.regex.Pattern;
public class IPv4Validator {
// 严格的IPv4正则(0-255,不允许前导零)
private static final String IPV4_PATTERN =
"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}" +
"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
public static boolean isValidIPv4(String ip) {
if (ip == null) return false;
return Pattern.matches(IPV4_PATTERN, ip);
}
public static void main(String[] args) {
System.out.println(isValidIPv4("192.168.1.1")); // true
System.out.println(isValidIPv4("256.1.2.3")); // false
System.out.println(isValidIPv4("01.02.03.04")); // false(前导零)
System.out.println(isValidIPv4("10.0.0.0")); // true
}
}方法二:手动解析判断(性能更好,无正则开销)
public static boolean isValidIPv4Manual(String ip) {
if (ip == null || ip.isEmpty()) return false;
String[] parts = ip.split("\\.");
if (parts.length != 4) return false;
for (String part : parts) {
// 检查空字符串或前导零(但不能只有单个0)
if (part.isEmpty() || (part.length() > 1 && part.charAt(0) == '0')) {
return false;
}
// 检查是否全数字
for (char c : part.toCharArray()) {
if (!Character.isDigit(c)) return false;
}
// 解析并检查范围
try {
int num = Integer.parseInt(part);
if (num < 0 || num > 255) return false;
} catch (NumberFormatException e) {
return false;
}
}
return true;
}方法三
import java.util.List;
import java.util.Objects;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.junit.jupiter.api.Test;
import lombok.extern.slf4j.Slf4j;
/**
* ip4地址合法判断<br>
* 注意:0.0.0.0(表示本地网络)、255.255.255.255(表示本地广播)是合法的
*
* @see [类、类#方法、类#成员]
*/
@Slf4j
public class IP4Test
{
@Test
public void test001()
{
for (int i = 0; i < 10; i++)
{
List<String> nums = new Random().ints(4, -10, 300).mapToObj(Objects::toString).collect(Collectors.toList());
String ip4 = StringUtils.join(nums, ".");
log.info("IP4地址: {} ==> {}", ip4, isIp4(ip4));
}
}
private boolean isIp4(String ip4)
{
String[] ipArr;
return StringUtils.isNotBlank(ip4) // 非空
&& StringUtils.countMatches(ip4, ".") == 3 // 3dots
&& (ipArr = StringUtils.split(ip4, ".")).length == 4 // 4位
&& Stream.of(ipArr)
.filter(it -> StringUtils.equals(it, String.valueOf(NumberUtils.toInt(it))))// 合法数字
.map(NumberUtils::toInt)
.filter(it -> (0 <= it && it <= 255))// [0, 255]
.count() == 4;
}
}测试结果:
2025-09-01 21:20:21.386 INFO 1220 --- [ main] c.f.t.IP4Test : IP4地址: 163.278.264.254 ==> false
2025-09-01 21:20:21.393 INFO 1220 --- [ main] c.f.t.IP4Test : IP4地址: 82.31.212.204 ==> true
2025-09-01 21:20:21.393 INFO 1220 --- [ main] c.f.t.IP4Test : IP4地址: 147.4.7.257 ==> false
2025-09-01 21:20:21.393 INFO 1220 --- [ main] c.f.t.IP4Test : IP4地址: 205.127.278.4 ==> false
2025-09-01 21:20:21.393 INFO 1220 --- [ main] c.f.t.IP4Test : IP4地址: 147.142.72.191 ==> true
2025-09-01 21:20:21.393 INFO 1220 --- [ main] c.f.t.IP4Test : IP4地址: 33.26.-10.33 ==> false
2025-09-01 21:20:21.394 INFO 1220 --- [ main] c.f.t.IP4Test : IP4地址: 130.281.293.240 ==> false
2025-09-01 21:20:21.394 INFO 1220 --- [ main] c.f.t.IP4Test : IP4地址: 192.203.292.3 ==> false
2025-09-01 21:20:21.394 INFO 1220 --- [ main] c.f.t.IP4Test : IP4地址: 158.99.278.165 ==> false
2025-09-01 21:20:21.394 INFO 1220 --- [ main] c.f.t.IP4Test : IP4地址: 188.131.294.172 ==> false
完整工具类示例
import java.util.Random;
import java.util.regex.Pattern;
public class IPv4Utils {
private static final Random random = new Random();
// 校验IPv4(正则版本)
public static boolean isValid(String ip) {
if (ip == null) return false;
String regex = "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." +
"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." +
"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." +
"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
return Pattern.matches(regex, ip);
}
// 生成随机公网IPv4
public static String randomPublic() {
int a;
do {
a = random.nextInt(256);
} while (a == 10 || a == 127 || a == 172 || a == 192 || a == 255 || (a >= 224 && a <= 239));
return a + "." + random.nextInt(256) + "." +
random.nextInt(256) + "." + random.nextInt(256);
}
// 生成随机私有IPv4(常用192.168.x.x)
public static String randomPrivate() {
return "192.168." + random.nextInt(256) + "." + random.nextInt(256);
}
public static void main(String[] args) {
System.out.println("公网IPv4: " + randomPublic());
System.out.println("私有IPv4: " + randomPrivate());
System.out.println("校验192.168.1.100: " + isValid("192.168.1.100"));
System.out.println("校验256.1.2.3: " + isValid("256.1.2.3"));
}
}到此这篇关于Java实现生成IPv4地址并判断其合法性的文章就介绍到这了,更多相关Java生成IPv4地址内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
