判断是否是内网IP的两种方法

引言

在网络通信中,IP地址是一个重要的概念。根据IP地址的不同,可以将其分为内网IP和外网IP。内网IP是指局域网中的IP地址,用于内部通信,而外网IP则是指可以通过公网访问的IP地址。在Java中,判断一个IP地址是否是内网IP有多种方法,本文将介绍其中的两种。

方法一:使用正则表达式判断

在Java中,可以使用正则表达式判断一个IP地址是否是内网IP。内网IP地址的范围通常是10.x.x.x172.16.x.x172.31.x.x192.168.x.x。下面是使用正则表达式判断的示例代码:

public static boolean isPrivateIP(String ip) {
    String[] parts = ip.split("\\.");
    
    if (parts.length != 4) {
        return false;
    }
    
    if (parts[0].equals("10")) {
        return true;
    }
    
    if (parts[0].equals("172")) {
        int second = Integer.parseInt(parts[1]);
        return second >= 16 && second <= 31;
    }
    
    if (parts[0].equals("192") && parts[1].equals("168")) {
        return true;
    }
    
    return false;
}

上述代码中,首先使用.分割IP地址的四个部分。然后,根据IP地址的不同部分进行判断,如果符合内网IP地址的范围,则返回true,否则返回false

方法二:使用位运算判断

除了使用正则表达式,还可以使用位运算判断一个IP地址是否是内网IP。内网IP地址的特点是,其第一个字节的二进制表示形式以0开头,或者以10开头,或者以110开头,或者以1110开头。下面是使用位运算判断的示例代码:

public static boolean isPrivateIP(String ip) {
    String[] parts = ip.split("\\.");
    
    if (parts.length != 4) {
        return false;
    }
    
    int first = Integer.parseInt(parts[0]);
    
    if ((first & 0x80) == 0 || (first & 0xC0) == 0x80 || (first & 0xE0) == 0xC0 || (first & 0xF0) == 0xE0) {
        return true;
    }
    
    return false;
}

上述代码中,首先使用.分割IP地址的四个部分。然后,将第一个部分转换为整数,并使用位运算进行判断,如果符合内网IP地址的特点,则返回true,否则返回false

序列图

下面是一个使用方法一判断是否是内网IP的序列图:

sequenceDiagram
    participant User
    participant Program
    
    User->>Program: 输入IP地址
    Program->>Program: 调用isPrivateIP方法
    Program-->>User: 返回判断结果

上述序列图描述了用户输入IP地址,程序调用判断内网IP的方法,并返回判断结果的过程。

总结

本文介绍了两种判断IP地址是否是内网IP的方法,分别是使用正则表达式和使用位运算。通过正则表达式可以将IP地址的不同部分进行判断,从而判断是否是内网IP。通过位运算可以根据IP地址的二进制表示形式进行判断,同样可以判断是否是内网IP。在实际使用中,可以根据具体的需求选择合适的方法来判断IP地址是否是内网IP。

引用

[1] [判断一个IP地址是否是内网IP的两种方法](