0

0

在Java中InetAddress如何获取IP地址_Java网络基础API解析

P粉602998670

P粉602998670

发布时间:2026-02-05 08:07:03

|

205人浏览过

|

来源于php中文网

原创

InetAddress.getHostAddress() 返回的IP类型取决于实际解析结果:DNS返回AAAA记录则为IPv6(如"2001:db8::1"),返回A记录则为IPv4(如"192.168.1.1"),不自动降级或转换。

在java中inetaddress如何获取ip地址_java网络基础api解析

getHostAddress() 返回的是 IPv4 还是 IPv6?

InetAddress.getHostAddress() 返回的是字符串形式的 IP 地址,具体是 IPv4 还是 IPv6 取决于该 InetAddress 实例实际解析出的地址类型。它不会自动降级或转换:如果 DNS 返回了 AAAA 记录(IPv6),就返回类似 "2001:db8::1" 的字符串;如果只返回 A 记录(IPv4),就返回类似 "192.168.1.1" 的字符串。

常见误区是认为它“默认返回 IPv4”,其实 JDK 会按系统配置和 DNS 响应优先级决定——例如 Linux 上若 /etc/gai.conf 启用了 IPv6 优先,且域名有 AAAA 记录,getByName("example.com") 就很可能返回 IPv6 地址。

  • 可通过 addr instanceof Inet4Addressaddr instanceof Inet6Address 显式判断类型
  • 若需强制获取 IPv4,可用 InetAddress.getAllByName(host) 遍历结果并筛选 Inet4Address 实例
  • 注意:某些内网环境 DNS 返回 IPv6 地址但本地未启用 IPv6 协议,会导致后续 socket 连接失败

getByName() 抛出 UnknownHostException 的真实原因

InetAddress.getByName(String host) 抛出 UnknownHostException 并不只代表“域名不存在”。它是一个笼统的异常,底层可能由多种网络或配置问题触发:

  • DNS 解析超时(如本地 DNS 服务器无响应,而非域名本身无效)
  • hosts 文件中存在错误条目(如 127.0.0.1 invalid-host 但该主机名未运行服务)
  • Java 启动参数禁用了 IPv6(-Djava.net.preferIPv4Stack=true)却尝试解析纯 IPv6 域名
  • Android 上因 SELinux 策略或网络权限缺失导致 getaddrinfo() 系统调用被拦截

调试时建议先用 nslookupdig 手动验证 DNS 是否可达,再检查 Java 进程是否在相同网络命名空间下(容器/Docker 中尤其容易忽略)。

立即学习Java免费学习笔记(深入)”;

6pen Art
6pen Art

AI绘画生成

下载

localhost 解析为什么有时返回 127.0.0.1,有时是 ::1?

调用 InetAddress.getByName("localhost") 的结果取决于 JVM 启动时的网络栈偏好设置和操作系统 hosts 文件内容。JDK 默认行为是:

  • /etc/hosts(Linux/macOS)或 C:\Windows\System32\drivers\etc\hosts(Windows)中 localhost 同时映射了 IPv4 和 IPv6(如 127.0.0.1 localhost::1 localhost),则返回第一个匹配项(顺序敏感)
  • 若仅定义了其中一种,就返回对应类型
  • 若设置了 -Djava.net.preferIPv4Stack=true,即使 hosts 里 IPv6 在前,也会优先选 127.0.0.1

这个行为在单元测试中容易引发非预期失败——比如测试代码假设 getByName("localhost").getHostAddress() 总是 "127.0.0.1",但在 CI 环境中因 hosts 文件差异或 JVM 参数不同而拿到 "::1",导致字符串比较失败。

getLocalHost() 获取不到本机外网 IP 的根本原因

InetAddress.getLocalHost() 返回的是本机 hostname 对应的首个非回环地址,但它**永远不会返回公网 IP**。原因很直接:hostname 通常只绑定到本地网络接口(如 eth0192.168.x.x10.x.x.x),而 NAT 网关之外的公网 IP 是由 ISP 分配、不在本机路由表中的。

  • 该方法本质调用的是系统 gethostbyname(gethostname()),查的是本地 DNS 或 hosts,不是网卡实时 IP
  • 多网卡机器上结果不可控(可能返回 docker0、vboxnet、wlan0 中任意一个的地址)
  • 若 hostname 解析失败(如 /etc/hosts 缺失对应条目),会抛出 UnknownHostException,而非退回到 127.0.0.1

真要获取“对外可见”的 IP,必须通过外部服务(如 http://ifconfig.me)发起 HTTP 请求,或者读取特定网卡的配置(需明确指定 interface 名称并过滤掉虚拟接口)。getLocalHost() 的唯一可靠用途,是获取本机在局域网内的可通信地址,且前提是你的 hosts 或 DNS 配置正确。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

564

2023.08.02

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

381

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1506

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

630

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

758

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

690

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

177

2025.07.29

抖音网页版入口与视频观看指南 抖音官网视频在线访问
抖音网页版入口与视频观看指南 抖音官网视频在线访问

本专题汇总了抖音网页版的入口链接、官方登录页面以及视频观看入口,帮助用户快速访问抖音网页版,提供免登录访问方式和直接进入视频播放页面的方法,确保顺利浏览和观看抖音视频。

61

2026.02.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.5万人学习

Git 教程
Git 教程

共21课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号