java获取电脑公网IP和内网IP

输出结果:

实现代码:

java 复制代码
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.*;

public class ServerIPUtils {

    public static void main(String[] args) {
        System.out.println(getCombinedIp());
        System.out.println(getExternalIp());
        System.out.println(getInternalIp());
    }

    /**
     * 获取拼接的IP地址(外网_内网)
     * 如果外网IP为空或获取失败,则只返回内网IP
     * @return 拼接后的IP地址
     */
    public static String getCombinedIp() {
        String externalIp = getExternalIp();
        String internalIp = getInternalIp();

        // 如果外网IP为空或为unknown,则只返回内网IP
        if (externalIp == null || externalIp.isEmpty()) {
            return internalIp;
        }

        // 否则返回 外网IP_内网IP 的格式
        return externalIp + "_" + internalIp;
    }

    /**
     * 获取内网IP地址
     * @return 内网IP地址
     */
    public static String getInternalIp() {
        try {
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
            while (interfaces.hasMoreElements()) {
                NetworkInterface networkInterface = interfaces.nextElement();
                if (networkInterface.isLoopback() || networkInterface.isVirtual() || !networkInterface.isUp()) {
                    continue;
                }

                Enumeration<InetAddress> addresses = networkInterface.getInetAddresses();
                while (addresses.hasMoreElements()) {
                    InetAddress address = addresses.nextElement();
                    String ip = address.getHostAddress();

                    // 跳过IPv6地址和回环地址
                    if (ip.contains(":") || ip.startsWith("127.")) {
                        continue;
                    }

                    // 返回第一个有效的私有IP地址
                    if (isValidIpAddress(ip)) {
                        return ip;
                    }
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }

        return "127.0.0.1"; // 默认返回本地回环地址
    }

    /**
     * 获取外网IP地址
     * @return 外网IP地址
     */
    public static String getExternalIp() {
        // 定义多个获取公网IP的服务URL
        String[] urls = {
                "http://ifconfig.me",
                "http://ifconfig.co",
                "http://icanhazip.com",
                "http://ident.me",
                "http://whatismyip.akamai.com"
        };

        // 尝试每个服务直到成功获取IP
        for (String url : urls) {
            try {
                HttpResponse response = HttpRequest.get(url)
                        .timeout(5000)
                        .execute();

                // 检查响应状态码和内容
                if (response.getStatus() == 200 && response.body() != null) {
                    String ip = response.body().trim();
                    if (!ip.isEmpty() && isValidIpAddress(ip)) {
                        return ip;
                    }
                }
            } catch (Exception e) {
                // 继续尝试下一个服务
                continue;
            }
        }

        return null;
    }


    // 验证IP地址格式是否有效
    private static boolean isValidIpAddress(String ip) {
        if (ip == null || ip.isEmpty()) {
            return false;
        }

        String[] parts = ip.split("\\.");
        if (parts.length != 4) {
            return false;
        }

        for (String part : parts) {
            try {
                int num = Integer.parseInt(part);
                if (num < 0 || num > 255) {
                    return false;
                }
            } catch (NumberFormatException e) {
                return false;
            }
        }

        return true;
    }

}

另外导入hutool包

XML 复制代码
       <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-http</artifactId>
            <version>5.8.20</version>
        </dependency>
相关推荐
云飞云共享云桌面1 分钟前
研发部门使用SolidWorks和ug,cad,设计共享云桌面应该怎么选?
运维·服务器·网络·人工智能·3d
BullSmall7 分钟前
linux 系统下模拟网络丢失和ping延迟,可以怎么来模拟
linux·网络·php
亚空间仓鼠8 分钟前
OpenEuler系统常用服务(十)
linux·运维·服务器·网络
艾莉丝努力练剑8 分钟前
【Linux线程】Linux系统多线程(四):线程ID及进程地址空间布局,线程封装
java·linux·运维·服务器·c语言·c++·学习
同聘云8 分钟前
阿里云国际站 服务器的“客户端” (Client) 和 “服务器” (Server)到底是什么?有什么区别?
服务器·网络·阿里云·云计算·云小强
邓霖涛9 分钟前
nginx使用openSSL自签生成https相关证书
服务器·nginx·https
程序员老邢19 分钟前
【技术底稿 10】16G Ubuntu 服务器手动部署 Ollama 0.20.4 全流程(避坑 HTTP2 错误)
服务器·ubuntu·ai·语言模型·devops
饼瑶20 分钟前
Isaac Sim 5.0.0 Docker 部署手册(实验室服务器)
服务器·docker·容器
dddddppppp12320 分钟前
linux head.s 从第一条指令到start_kernel
linux·运维·服务器
ZGi.ai20 分钟前
一个LLM网关需要处理哪些工程问题?多模型路由与成本归因实战
大数据·网络·人工智能