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
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
推荐阅读
-
IDEA中使用Gradle构建项目中文报GBK错误的解决方案
-
将Java应用做成exe可执行软件的流程步骤
-
SpringBoot实现多种来源的Zip多层目录打包下载
需要将一批文件(可能分布在不同目录、不同来源)打包成zip格式,按目录结构导出给用户下载。1.核心思路支持将本地服务器上的文...
-
Java中减少if-else的设计模式和优化技巧
前言“过于依赖if-else不仅会让代码变得臃肿不堪,还会使维护成本大大增加。其实,if-else虽然是最基础的条件分支,...
-
Spring Boot 中使用 Drools 规则引擎的完整步骤
-
Spring Boot整合Drools规则引擎实战指南及最佳实践
一、drools简介与核心概念1.1什么是drools?drools是redhat旗下的开源业务规则管理系统(brms),...
-
Springboot项目瘦身之如何将jar包与lib依赖分开打包
将jar包与lib依赖分开打包方法一:项目和依赖完全分离maven-jar-plugin负责生成jar文件(jar文件中...
-
Spring动态修改bean属性配置key的几种方法
静态配置的局限性先来看一个典型场景。假设我们有一个数据源配置类:@configuration@configurationpr...
-
从零开始学java之二叉树和哈希表实现代码
-
Java如何解决ArrayList的并发问题
arraylist是java.util包中的一个类,它不是线程安全的。如果多个线程同时对同一个arraylist进行操作,可能会...