jdk8-获取本机ip、判断ip范围、ip与long互转等

news2024/11/29 10:49:18

在配置nginx的ip白名单时候,会通过ip段进行配置(如 10.10.10.10/24),就在思考这种配置怎么通过代码解析并判断,故通过搜索网络内容,并通过java编写测试代码。代码及说明来源网络,并进行了部分调整。故有疑问请提出来,本人小白一枚,勿喷
代码内容:获取本机ip、判断ip范围、ip与long互转等
IP: 网络地址
掩码: 指明一个IP地址的哪些位标识的是主机所在的子网。
网段:网络中可通信的部分,一般用子网第一个地址表示。
广播地址:专门用于同时向网络中所有工作站进行发送的一个地址;一般用子网最后一个地址表示。
可用子网ip:一般指子网中去除网段、广播地址的地址范围

参考

处理ip,java判断ip是否在指定的ip段范围内,给定的ip地址是否在某个ip段范围内,将字符串形式IP地址转换long类型
ip地址与掩码、网段、广播地址、可用ip范围
java实现 IP/掩码位 转换 ip段范围
192.168.和10.0.开头的IP、内网IP段、IP简介、分类——IP观止
JDK8 Java 中遇到null 和为空的情况,使用Optional来解决
什么是ip地址

代码

demo

代码参考自 参考内,并进行了部分重构

import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Optional;

/**
 * Ip工具类
 *
 * @author z.y.l
 * @version v1.0
 * @date 2022/12/13
 */
public class IpUtil {
    private static final int I_32 = 32;
    /** ip 255.255.255.255 >>> 11111111111111111111111111111111 */
    private static final long VALIDATE_DATA = 4294967295L;
    private static final HashMap<Integer,String> NET_MASK = new HashMap<>();
    /** 1-255 正则 */
    private static final String REG_1_255 = "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])";
    /** 0-255 正则 */
    private static final String REG_0_255 = "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)";
    /** ip 正则 */
    private static final String IP_REGEX = "^" + REG_1_255 + "\\." + REG_0_255 + "\\." + REG_0_255 + "\\." + REG_0_255 + "$";
    static {
        /* 初始化掩码 */
        NET_MASK.put( I_32, long2ip( VALIDATE_DATA ) );
        for(int i = 1 ; i < I_32 ; i++ ){
            NET_MASK.put( I_32-i, long2ip( VALIDATE_DATA << i & VALIDATE_DATA ) );
        }
    }

    public static void main(String[] args) {
        String localIp = inetIp();
        System.out.println("本机ip:"+localIp);
        System.out.println("-------------");
        System.out.println(new IpInf("192.168.1.2", "255.255.254.0").toString());
        System.out.println(new IpInf("192.168.1.3", "255.255.255.0").toString());
        System.out.println("-------------");
        String ip="10.10.10.116";
        String startIP = "10.10.1.0";
        String endIP = "10.10.255.255";
        System.out.println("ip:10.10.10.116>>>"+ip2Long(ip));
        System.out.println("ip:10.10.10.116,startIP:10.10.1.0,endIP:10.10.255.255,>>>"+ipExistsIn(ip,startIP,endIP));
        System.out.println("-------------");
        //判断一个IP是否属于某个网段
        System.out.println("ip:10.2.1.0,cip:10.2.0.0/17,>>>"+ipIsIn("10.2.1.0", "10.2.0.0/17"));
    }
    /**
     * 获取 本机ip
     * @return 本机ip
     */
    public static String inetIp(){
        try {
            Enumeration<NetworkInterface> nif = NetworkInterface.getNetworkInterfaces();
            while (nif.hasMoreElements()) {
                NetworkInterface ni = nif.nextElement();
                Enumeration<InetAddress> inet = ni.getInetAddresses();
                while (inet.hasMoreElements()) {
                    InetAddress ia = inet.nextElement();
                    if (!ia.isLinkLocalAddress() && !ia.isLoopbackAddress() && ia instanceof Inet4Address) {
                        return ia.getHostAddress();
                    }
                }
            }
        } catch (Exception e) {
            return null;
        }
        return "";
    }
    /** 判断一个ip地址是否在某个ip段范围内 */
    public static boolean ipExistsIn(String ip,String start,String end){
        long ipL = ip2Long(ip);
        return ( ip2Long(start) <= ipL ) && ( ip2Long(end) >= ipL );
    }
    /**
     * 功能:判断一个IP是不是在一个网段下的
     * 格式:isInRange("192.168.8.3", "192.168.9.10/22");
     */
    public static boolean ipIsIn(String ip,String cip){
        long ipL = ip2Long(ip);
        String[] split = cip.split("/");
        int mask = 0xFFFFFFFF << ( 32L - s2l(split[1]));
        long cipL = ip2Long(split[0]);
        return ( ipL & mask ) == ( cipL & mask );
    }
    /** 把long类型的Ip转为一般Ip类型:xx.xx.xx.xx */
    public static String long2ip(Long ip){
        Long tmp = Optional.ofNullable(ip).filter(l -> l >= 0 && l <= VALIDATE_DATA )
                .orElseThrow(()-> new RuntimeException(ip + " 数字 不在 有效ip范围."));
        // 255.0.0.0 ~ 1.0.0.0,0.255.0.0 ~ 0.1.0.0,0.0.255.0 ~ 0.0.1.0,0.0.0.255 ~ 0.0.0.1
        return (tmp>>>24) + "." + (tmp>>>16&255L) + "." + (tmp>>>8&255L) + "." + (tmp&255L);
    }
    /** 将字符串形式IP地址转换long类型 */
    public static long ip2Long(String ip){
        ip = checkIp(ip);
        String[] split = ip.trim().split("\\.");
        return ( s2l(split[0]) << 24 ) + ( s2l(split[1]) << 16 ) + ( s2l(split[2]) << 8 )+ ( s2l(split[3]) );
    }
    private static long s2l(String s){
        return Long.parseLong(s,10);
    }
    private static String checkIp(String ip){
        return Optional.ofNullable(ip).filter(s -> !s.isEmpty()&&s.matches(IP_REGEX))
                .orElseThrow(() -> new RuntimeException(ip + " ip地址不合法."));
    }
    private static String checkMask(String mask){
        return Optional.ofNullable(mask).filter(s -> !s.isEmpty()&&NET_MASK.containsValue(mask))
                .orElseThrow(() -> new RuntimeException( mask + "掩码不合法."));
    }
    public static class IpInf{
        /** ip */
        private final Inf ip;
        /** 掩码 */
        private final Inf mask;
        /** 网段 */
        private final Inf segment;
        /** 广播地址 */
        private final Inf broadcast;
        /** 开始ip */
        private final Inf startIp;
        /** 结束ip */
        private final Inf endIp;
        /** 可用ip数 */
        private final Long count;
        /**
         * 初始化
         * @param ip 如 192.168.1.1
         * @param mask 掩码 如 255.255.255.255
         */
        public IpInf(String ip,String mask){
            System.out.println("ip:"+ip+",mask:"+mask);
            this.ip = new Inf(checkIp(ip));
            this.mask = new Inf(checkMask(mask));
            //网段 = ip & 掩码
            this.segment = new Inf(this.ip.val & this.mask.val);
            // 广播地址 网段末尾用1补齐
            this.broadcast = new Inf(this.segment.val | (~this.mask.val & VALIDATE_DATA));
            // 开始地址 网段+1
            this.startIp = new Inf(this.segment.val + 1L);
            // 结束地址 广播地址-1
            this.endIp = new Inf(this.broadcast.val - 1L);
            this.count = this.endIp.val - this.startIp.val;
        }

        public Inf ip() { return ip; }
        public Inf mask() { return mask; }
        public Inf segment() { return segment; }
        public Inf broadcast() { return broadcast; }
        public Inf startIp() { return startIp; }
        public Inf endIp() { return endIp; }
        public Long count() { return count; }

        @Override
        public String toString() {
            return "{ip=" + ip + ", mask=" + mask + ", segment=" + segment + ", broadcast=" + broadcast
                    + ", startIp=" + startIp + ", endIp=" + endIp + ", count=" + count + '}';
        }
    }
    public static class Inf{
        private final String lab;
        private final Long val;
        Inf(String l){ this.lab = l;this.val = ip2Long(l); }
        Inf(Long v){ this.val = v;this.lab = long2ip(v); }
        public Long toLong() { return val; }
        public String toStr() { return lab; }

        @Override
        public String toString() {
            return "{str='" + lab + "', long=" + val + '}';
        }
    }
}

测试

本机ip:192.168.***.171
-------------
ip:192.168.1.2,mask:255.255.254.0
{ip={str='192.168.1.2', long=3232235778}, mask={str='255.255.254.0', long=4294966784}, segment={str='192.168.0.0', long=3232235520}, broadcast={str='192.168.1.255', long=3232236031}, startIp={str='192.168.0.1', long=3232235521}, endIp={str='192.168.1.254', long=3232236030}, count=509}
ip:192.168.1.3,mask:255.255.255.0
{ip={str='192.168.1.3', long=3232235779}, mask={str='255.255.255.0', long=4294967040}, segment={str='192.168.1.0', long=3232235776}, broadcast={str='192.168.1.255', long=3232236031}, startIp={str='192.168.1.1', long=3232235777}, endIp={str='192.168.1.254', long=3232236030}, count=253}
-------------
ip:10.10.10.116>>>168430196
ip:10.10.10.116,startIP:10.10.1.0,endIP:10.10.255.255,>>>true
-------------
ip:10.2.1.0,cip:10.2.0.0/17,>>>true

截图
在这里插入图片描述

END

代码仅供参考,请充分测试后在使用。谢谢Thanks♪(・ω・)ノ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/87891.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谷歌神秘项目曝光,能写代码还会改bug的AI,这。。。。

做一个程序员&#xff0c;压力有多大&#xff1f;反正&#xff0c;最近的一个传闻&#xff0c;是让码农们瑟瑟发抖...... 传说谷歌正在研发一个秘密的新项目&#xff0c;教AI写代码。据说&#xff0c;学会之后&#xff0c;AI不仅能写代码&#xff0c;还会修复bug。 写代码这件…

异次元发卡系统源码荔枝发卡V3.0

1.将源码上传到宝塔站点目录之后解压 2.去config目录下找到database.php文件配置数据库 3.导入数据库 4.切换php版本8.0 5.设置伪静态 伪静态代码 location ~* (runtime|application)/{ return 403; } location / { if (!-e $request_filename){ rewrite ^(.*)$ /index…

[附源码]Node.js计算机毕业设计防疫物资捐赠系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

物联网设备预警解决方案

物联网设备管理平台整合互亿无线预警解决方案&#xff0c;可以将设备预警信息第一时间通知到管理、维护人员。 场景应用示例&#xff1a; 设备**报错&#xff0c;报错类型为**&#xff0c;请及时排查。 温度监控系统&#xff0c;**设备&#xff0c;当前湿度&#xff1a;**&a…

VTK-vtkCleanPolyData/vtkQuantizePolyDataPoints

小结&#xff1a;本文主要讲述vtk中vtkCleanPolyData过滤器的作用和实现原理&#xff0c;希望对各位小伙伴能有所帮助&#xff01; 示例&#xff1a; 将下图进行Clean&#xff0c;设置Tolerance为0.01&#xff08;相对误差&#xff09;。 vtkCleanPolyData …

[附源码]Python计算机毕业设计SSM基于JAVA语言的国货美妆店管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

差分信号,共模与差模,共模滤波,差模滤波

普通并行信号. 两个信号是一样的,相位相同, 这样的信号应该属于普通的并行信号不是差分信号. 差分信号 注意中间的黑色线是0电位. 共模干扰. 共模干扰也就是两个信号一起干扰. 我个人的理解. 如有不对欢迎批评指正. 不管信号是差分信号还是普通信号, 干扰都会一样存在. 所…

解决方案分享:数商云S2B2C系统如何赋能医药企业实现深度营销数字化

营销是企业的关键一环&#xff0c;对驱动企业经营业绩增长具有重要意义。现阶段&#xff0c;面对带量采购与疫情带来的双重压力与挑战&#xff0c;越来越多医药企业开始数字化转型实践&#xff0c;用有限的资源投入实现营销效果最大化&#xff0c;这其中&#xff0c;大型跨国医…

iDdesktopX将本地的数据分享至 iPortal 中

文章目录前言一.iDdesktopX添加iPortal地址二.iDdesktopX分享地图至iPortal三.在iPortal中查看分享地图和工作空间注意作者&#xff1a;kxj 前言 云时代下&#xff0c;SuperMap iDesktopX 也站在了云端&#xff0c;SuperMap iDesktopX 连通了 SuperMap Online 和 iPortal 两个平…

物业养老,智慧养老新方式

1、新导智能看护 老人在家中通过智能看护系统&#xff0c;可以实现实时监护和远程守护。 1)可远程视频探视 为老年人提供实时视频探访服务&#xff0c;支持手机端实时查看老人情况。 2)远程可视对讲 通过视频远程实时查看老年人情况&#xff0c;可实现紧急情况下的快速响应。…

再学C语言3:C语言概述(1)

简单的示例程序&#xff1a; #include <stdio.h>int main(void) {int num;num 1;printf("I am a simple computer.\n");printf("My favorite number is %d because it is first.\n", num);return 0; } 运行结果&#xff1a; C程序剖析&#xff1a…

JEC-QA:A Legal-Domain Question Answering Dataset 论文阅读

文章目录介绍相关工作Open QA数据集实验检索策略baseline实验结果数据来源&#xff1a;中国国家司法考试模型准确率 28%&#xff0c;专业人士可以达到81%&#xff0c;非专业人士可以达到64%数据集下载链接&#xff1a;http://jecqa.thunlp.org/代码链接&#xff1a;https://git…

web前端大作业(基于HTML+CSS+JavaScript仿阴阳师游戏官网首页作业制作)

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

1780. 判断一个数字是否可以表示成三的幂的和

目录题目深搜&#xff08;不超时&#xff09;动态规划&#xff08;超时写法&#xff09;二维空间优化&#xff08;一维&#xff09;题目 给你一个整数 n &#xff0c;如果你可以将 n 表示成若干个不同的三的幂之和&#xff0c;请你返回 true &#xff0c;否则请返回 false 。 对…

海德汉机床联网

一、设备信息确认 1、确认型号 数控面板拍照确认&#xff1a; 此系统为&#xff1a;海德汉530操作系统 还有一种情况是面板无任何版本信息&#xff0c;这时就需要进入系统里面再确认。 2、确认通讯接口 打开电器柜后既可看到网口。编号X26 3、确认数控系统软件版本(以620为…

Java+Swing实现自助取款机(ATM)系统-TXT存储数据

JavaSwing实现自助取款机ATM系统-TXT存储数据一、系统介绍1.系统功能2.环境配置3.工程截图二、系统展示1.登录页1.1登录成功2.取款2.1取款成功3.存款3.1 存款成功4.转账5.余额查询6.退出系统三、部分代码AccountDao.javaLoginFrame.javaAccount.java四、其他获取源码一、系统介…

rocketmq源码-producer发送消息

前言 这篇笔记&#xff0c;记录producer发送消息的相关源码 我们以最简单的demo为例 public static void main(String[] args) throws MQClientException, InterruptedException {DefaultMQProducer producer new DefaultMQProducer("please_rename_unique_group_name&…

去哪儿是如何做到大规模故障演练的?|TakinTalks

# 一分钟精华速览 #混沌工程作为一种提高技术架构弹性能力和容错能力的复杂技术手段&#xff0c;近年来讨论声音不断&#xff0c;相比在分布式系统上进行随机的故障注入实验&#xff0c;基于混沌工程的大规模自动化故障演练&#xff0c;不仅能将“作战演习”常态化&#xff0c;…

Spring结合mybatis

目录 一、Spring结合mybatis 二、业务层添加声明式事务 1、事务的传播机制 2、事务的四大特性 3、事务的隔离级别 4、事务属性 一、Spring结合mybatis 1.创建Web工程&#xff0c;导入Spring和MyBatis的相关依赖 <!-- springmybatis整合 --><dependency><…

web渗透安全测试(靶场搭建及常见漏洞攻防)

渗透测试 渗透测试&#xff08;Penetration test&#xff09;即安全工程师模拟黑客&#xff0c;在合法授权范围内&#xff0c;通过信息搜集、漏洞挖掘、权限提升等行为&#xff0c;对目标对象进行安全测试&#xff08;或攻击&#xff09;&#xff0c;最终找出安全风险并输出测…