千家信息网

java中怎么获取ip地址

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,java中怎么获取ip地址 ,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。package com.ysma.jobs.util;im
千家信息网最后更新 2026年11月01日java中怎么获取ip地址

java中怎么获取ip地址 ,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

package com.ysma.jobs.util;import com.ysma.jobs.common.component.RedisManager;import com.ysma.jobs.common.constants.CacheKeyConstants;import com.ysma.jobs.common.dingtalk.ChatbotSend;import com.ysma.jobs.service.XxlService;import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.DependsOn;import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;import java.net.InetAddress;import java.net.NetworkInterface;import java.net.UnknownHostException;import java.util.Enumeration;import java.util.concurrent.TimeUnit;/** * IP地址获取工具 * @Date: 2019/6/17 14:26 * modified by ysma 2019-06-28 */@DependsOn(value = {"redisManager", "chatbotSend", "xxlService"})@Component@Slf4jpublic class IpAdressUtil {    @Autowired    private ChatbotSend chatbotSend;    @Autowired    private XxlService xxlService;    @Autowired    private RedisManager redisManager;    /**定义一个static的ip变量,使得其全栈可见*/    private static volatile String MACHINE_IP;    private final String OS_WINDOWS = "windows";    private final String OS_MAC = "mac";    public String getServerIp(){        if(StringUtils.isEmpty(MACHINE_IP)){            log.error("IpAddressUtil.getServerIp 为获取到服务器ip,MACHINE_IP:{}", MACHINE_IP);            return null;        }        return MACHINE_IP;    }    /**     * 同步指定执行机器的ip地址到redis,以便所有机器共享此信息,进行协同     * @param ip ip地址     */    private void setJobRunIP(String ip){        String key = CacheKeyConstants.JOB_DEFAULT_RUN_IP;        boolean result = redisManager.set(key, ip);        log.info("IpAddressUtil.setJobRunIP set job running ip runIp:{}, result:{}" , ip, result);    }    /**     * 获取本地IP地址     * 操作系统的判断仅能判断出是何种操作系统,但是操作系统的版本就会有偏差     * 本需求仅涉及ip故忽略操作系统版本的偏差继续使用     */    @PostConstruct    public void initIp() {        //        Thread initIpThread = new Thread(() -> {            //1.本地ip地址初始化            boolean goOn = true;            do {                MACHINE_IP = getMachineIp();                try {                    goOn = StringUtils.isEmpty(MACHINE_IP);                    if(goOn){//钉钉告警直到获取到ip地址                        chatbotSend.sendMsg("请注意,scheduler应用当前未获取到ip地址! 5秒后重试");                        TimeUnit.SECONDS.sleep(5);                    }                } catch (Exception ex) {                    log.error("IpAddressUtil.initIp Exception V_V", ex);                }            } while (goOn);//直到获取到本地ip 停止            //2.分布式指定执行ip初始化            try {                String executeIps = xxlService.getExecuteIps();                String[] split = executeIps.split(",");                if(StringUtils.isEmpty(executeIps)){                    log.error("IpAddressUtil.initIp xxl未配置指定运行的ip地址信息,此处默认指定本机ip,是以最后启动的机器ip将获得执行权限");                    setJobRunIP(MACHINE_IP);                } else {                    setJobRunIP(split[0]);                }                Object runIp = redisManager.get(CacheKeyConstants.JOB_DEFAULT_RUN_IP);                log.info("IpAddressUtil.initIp 本机ip:{}, 指定运行ip:{}", MACHINE_IP,                        runIp == null ? "": runIp.toString());            } catch (Exception ex) {                log.error("IpAddressUtil.initIp Exception V_V", ex);            }        });        initIpThread.setName("init-ip-thread");        initIpThread.start();    }    /**     * 判断何种操作系统     */    private boolean isThisOS(String prefixName) {        String osName = System.getProperty("os.name");        return osName.toLowerCase().startsWith(prefixName);    }    /**     * 获取机器的IP地址     */    private String getMachineIp() {        String ipString = null;        try {            if(isThisOS(OS_WINDOWS)){                ipString = InetAddress.getLocalHost().getHostAddress();                log.info("IpAddressUtil.getMachineIp windows os, ip:{}", ipString);            } else {                Enumeration netInterfaces = NetworkInterface.getNetworkInterfaces();                boolean findFlag = false;                while (netInterfaces.hasMoreElements()) {                    if(findFlag){                        break;                    }                    NetworkInterface ni = netInterfaces.nextElement();                    Enumeration ips = ni.getInetAddresses();                    while (ips.hasMoreElements()) {                        InetAddress address = ips.nextElement();                        if( address.isSiteLocalAddress()                                && !address.isLoopbackAddress()   //127.开头的都是lookback地址                                && !address.getHostAddress().contains(":")){                            ipString = address.getHostAddress();                            findFlag = true;                            break;                        }                    }                }                log.info("IpAddressUtil.getMachineIp {} os, ip:{}",                        isThisOS(OS_MAC) ? "Mac" : "linux/unix",                        ipString);            }        } catch (Exception ex) {            log.error("IpAddressUtil.getMachineIp error", ex);        }        return ipString;    }}

关于java中怎么获取ip地址 问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

地址 操作系统 系统 机器 问题 偏差 更多 版本 本机 帮助 解答 运行 易行 简单易行 信息 内容 分布式 变量 小伙 小伙伴 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技有限公司 互联网科技公司起名 湖南永感互联网科技有限公司 云信互联网科技有限公司 互联网科技公司华为 今日互联网科技 科技互联网政务服务 港股互联网科技股 北京互联网科技有限公司 合肥互联网科技公司 互联网科技公司电话 安控科技rtu产品工业互联网 互联网科技公司需要的职位 广州慧亚互联网科技怎么样 世界互联网领先科技成果获奖 中天科技中国工业互联网 抖集互联网科技技术咨询 唐山双旺合互联网科技产业园 数字科技和互联网金融哪个好 利用互联网等科技手段 互联网科技咨询 人人互联网科技是培训 互联网科技寓意 深圳市优智互联网科技有限公司 互联网科技和法律行业 图游互联网科技 全球科技与互联网公司市值变化 玉溪新华互联网科技怎么选 盐城市攀科互联网科技有限公司 小牛互联网科技有限公司地址
0