Java如何判断一个IP是否在给定的网段内

 更新时间:2025年04月30日 09:51:38   作者:Roc.Chang  
这篇文章主要介绍了Java如何判断一个IP是否在给定的网段内问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

要在Java中判断一个IP地址是否在给定的网段内,可以使用子网掩码IP地址子网掩码进行与操作来提取网络地址,并将其与给定的子网地址进行比较。

方法一:借助于 Java 提供的 InetAddress

下面的例子由强大的 ChatGPT 提供

代码如下所示(子网掩码的计算可以截取字符串后,借助底部的算法进行获得):

public static boolean isIpAddressInSubnet(String ipAddress, String subnetAddress, String subnetMask) throws UnknownHostException {
    InetAddress inetAddress = InetAddress.getByName(ipAddress);
    InetAddress subnet = InetAddress.getByName(subnetAddress);
    InetAddress mask = InetAddress.getByName(subnetMask);

    byte[] inetAddressBytes = inetAddress.getAddress();
    byte[] subnetBytes = subnet.getAddress();
    byte[] maskBytes = mask.getAddress();

    for (int i = 0; i < inetAddressBytes.length; i++) {
        int addressByte = inetAddressBytes[i] & 0xFF;
        int subnetByte = subnetBytes[i] & 0xFF;
        int maskByte = maskBytes[i] & 0xFF;

        if ((addressByte & maskByte) != (subnetByte & maskByte)) {
            return false;
        }
    }

    return true;
}

这个方法接受三个参数:

要检查的IP地址子网地址子网掩码。它使用InetAddress类将这些字符串转换为Java对象,然后将它们转换为字节数组。然后,它迭代每个字节,并将每个字节的值与相应的子网字节和掩码字节进行比较,以提取网络地址。

如果网络地址与子网地址不匹配,则返回false,否则返回true

例如,假设我们要检查IP地址 “192.168.1.100” 是否在子网"192.168.1.0/24"中:

boolean result = isIpAddressInSubnet("192.168.1.100", "192.168.1.0", "255.255.255.0");
if (result) {
    System.out.println("IP address is in subnet");
} else {
    System.out.println("IP address is not in subnet");
}

方法二:撸个算法实现(二进制计算)

代码来源于 Google,但是明白原理即可,不需要深究。

不管怎么样肯定都会需要 IP 地址子网掩码才能组成一个子网范围;然后判断另一个给定的 IP 是否在这个网段内。

/**
 * 判断是否在该网段中
 *
 * @param subnetRange 子网范围 x.x.x.x/xx 形式
 */
public static boolean isIpAddressInSubnet(String ipAddress, String subnetRange) {
    String[] networkips = ipAddress.split("\\.");
    int ipAddr = (Integer.parseInt(networkips[0]) << 24)
            | (Integer.parseInt(networkips[1]) << 16)
            | (Integer.parseInt(networkips[2]) << 8)
            | Integer.parseInt(networkips[3]);
            
    // 拿到主机数       
    int type = Integer.parseInt(subnetRange.replaceAll(".*/", ""));
    int ipCount = 0xFFFFFFFF << (32 - type);
    
    String maskIp = subnetRange.replaceAll("/.*", "");
    String[] maskIps = maskIp.split("\\.");
    
    int cidrIpAddr = (Integer.parseInt(maskIps[0]) << 24)
            | (Integer.parseInt(maskIps[1]) << 16)
            | (Integer.parseInt(maskIps[2]) << 8)
            | Integer.parseInt(maskIps[3]);
            
    return (ipAddr & ipCount) == (cidrIpAddr & ipCount);
}

例如,假设我们要检查IP地址 “192.168.1.100” 是否在子网"192.168.1.0/24"中:

boolean result = isIpAddressInSubnet("192.168.1.100", "192.168.1.0/24");
if (result) {
    System.out.println("IP address is in subnet");
} else {
    System.out.println("IP address is not in subnet");
}

其他

数字转为子网掩码

public static String subnetMaskFromPrefixLength(int prefixLength) {
    if (prefixLength < 0 || prefixLength > 32) {
        throw new IllegalArgumentException("Invalid prefix length");
    }

    int mask = 0xffffffff << (32 - prefixLength);
    return String.format("%d.%d.%d.%d",
        (mask & 0xff000000) >>> 24,
        (mask & 0x00ff0000) >>> 16,
        (mask & 0x0000ff00) >>> 8,
        (mask & 0x000000ff));
}

示例:

String subnetMask = subnetMaskFromPrefixLength(24);
System.out.println(subnetMask); // 输出:255.255.255.0

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java实现随机验证码功能实例代码

    Java实现随机验证码功能实例代码

    在这里,我们使用servlet来实现随机验证码的实现,有需要的朋友可以参考一下
    2013-08-08
  • SpringBoot http post请求数据大小设置操作

    SpringBoot http post请求数据大小设置操作

    这篇文章主要介绍了SpringBoot http post请求数据大小设置操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Mybatis配置错误:java.lang.ExceptionInInitializerError

    Mybatis配置错误:java.lang.ExceptionInInitializerError

    这篇文章主要介绍了Mybatis配置错误:java.lang.ExceptionInInitializerError的相关资料,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Jdbc连接数据库基本步骤详解

    Jdbc连接数据库基本步骤详解

    这篇文章主要为大家详细介绍了Jdbc连接数据库的基本步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • MyBatis limit分页设置的实现

    MyBatis limit分页设置的实现

    这篇文章主要介绍了MyBatis limit分页设置的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • System 类 和 Runtime 类的常用用法介绍

    System 类 和 Runtime 类的常用用法介绍

    这篇文章主要介绍了System 类 和 Runtime 类的常用用法,有需要的朋友可以参考一下
    2014-01-01
  • JAVAE中servlet的概念及使用示例详解

    JAVAE中servlet的概念及使用示例详解

    servlet是一种实现动态页面的技术,他是由tomcat提供给程序员的一组API可以帮助程序员开发一个web程序,这篇文章主要介绍了JAVAE中servlet的概念及使用,需要的朋友可以参考下
    2024-05-05
  • Java中多线程的ABA场景问题分析

    Java中多线程的ABA场景问题分析

    这篇文章主要为大家介绍了Java中多线程的ABA场景问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • springboot+mybatis拦截器方法实现水平分表操作

    springboot+mybatis拦截器方法实现水平分表操作

    这篇文章主要介绍了springboot+mybatis拦截器方法实现水平分表操作,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • SpringBoot使用开发环境application.properties问题

    SpringBoot使用开发环境application.properties问题

    这篇文章主要介绍了SpringBoot使用开发环境application.properties问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07

最新评论