怎么通过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.org、api.ipify.org)。
✅ 五、其他推荐方式
1. 使用
ipify.orgAPI(更简单)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.org或api.ipify.org等标准 API 获取公网 IP,更加可靠且易于维护。
如果你有进一步的需求(如定时检测 IP 变化、多线程获取等),也可以告诉我,我可以为你扩展功能!
解决 无用评论 打赏 举报- 请求方式:使用