m0_70513232 2026-02-02 16:32 采纳率: 0%
浏览 5

https://www.ip138.com/ 怎么通过java代码获取本机公网ip

怎么通过java代码获取本机公网ip,如: https://www.ip138.com/ ,中可以显示ip,但是java怎么获取

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-02-02 16:33
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    要通过 Java 代码获取本机的 公网 IP 地址,可以使用多种方法。其中一种常见的方法是访问类似 https://www.ip138.com/ 这样的网站,通过解析其返回的数据来获取当前设备的公网 IP。


    一、获取本机公网 IP 的原理

    Java 本身无法直接获取公网 IP(因为 Java 程序运行在本地网络中,只能获取到本地 IP),但可以通过访问外部 API 或网站来获取公网 IP。


    二、解决方案步骤

    1. 使用 HTTP 请求访问 IP 查询网站

    例如:https://www.ip138.com/ 是一个提供 IP 查询服务的网站,可以通过发送 HTTP 请求并解析返回内容来获取公网 IP。

    2. 解析返回的 HTML 内容

    该网站返回的页面中包含当前 IP 地址的信息,需要提取出 IP 字符串。

    3. 处理异常和超时

    设置合理的请求超时时间,并捕获可能发生的异常。


    三、Java 示例代码(完整版)

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class GetPublicIP {
    
        public static void main(String[] args) {
            String url = "https://www.ip138.com/";
            String ip = getPublicIP(url);
            System.out.println("**本机公网 IP 地址为:** " + ip);
        }
    
        public static String getPublicIP(String urlString) {
            try {
                URL url = new URL(urlString);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.setConnectTimeout(5000); // 设置连接超时时间为5秒
                conn.setReadTimeout(5000);   // 设置读取超时时间为5秒
    
                int responseCode = conn.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                    StringBuilder response = new StringBuilder();
                    String inputLine;
    
                    while ((inputLine = in.readLine()) != null) {
                        response.append(inputLine);
                    }
                    in.close();
    
                    // 使用正则表达式提取 IP 地址
                    Pattern pattern = Pattern.compile("\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b");
                    Matcher matcher = pattern.matcher(response.toString());
    
                    if (matcher.find()) {
                        return matcher.group();
                    }
                } else {
                    System.out.println("请求失败,响应码: " + responseCode);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return "无法获取公网 IP";
        }
    }
    

    四、重点说明

    • 请求方式:使用 HttpURLConnection 发送 GET 请求。
    • IP 提取:使用正则表达式 \b(?:\d{1,3}\.){3}\d{1,3}\b 来匹配 IP 地址。
    • 安全性:建议在实际项目中使用更安全的 HTTP 客户端(如 Apache HttpClient 或 OkHttp)。
    • 依赖库:如果需要更稳定的 IP 查询服务,可以考虑使用第三方 API(如 ipify.orgapi.ipify.org)。

    五、其他推荐方式

    1. 使用 ipify.org API(更简单)

    public static String getPublicIP() {
        try {
            URL url = new URL("https://api.ipify.org?format=json");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
    
            int responseCode = conn.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                String inputLine;
                StringBuilder response = new StringBuilder();
    
                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();
    
                // 解析 JSON 返回值
                String json = response.toString();
                int start = json.indexOf("\"ip\": \"") + 6;
                int end = json.indexOf("\"", start);
                return json.substring(start, end);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "无法获取公网 IP";
    }
    

    六、总结

    | 方法 | 是否需要网络 | 是否稳定 | 推荐度 | |------|--------------|----------|--------| | ip138.com | ✅ | ⭐⭐⭐ | 推荐 | | ipify.org | ✅ | ⭐⭐⭐⭐ | 推荐 | | 本地网关查询 | ❌ | ⭐ | 不推荐 |

    最终建议:使用 ipify.orgapi.ipify.org 等标准 API 获取公网 IP,更加可靠且易于维护。


    如果你有进一步的需求(如定时检测 IP 变化、多线程获取等),也可以告诉我,我可以为你扩展功能!

    评论

报告相同问题?

问题事件

  • 创建了问题 2月2日