InetAddress 是 Java 中表示 IP 地址和主机名的核心类,通过静态方法实现正向解析(主机名→IP)、反向解析(IP→主机名)及本地地址获取;不提供公共构造函数,依赖 DNS 查询或直接地址构造,失败抛 UnknownHostException。

InetAddress 是 Java 网络编程中用于表示 IP 地址和主机名的核心类,它不直接创建实例,而是通过静态方法完成主机名解析与地址获取。关键在于理解“正向解析”(主机名 → IP)和“反向解析”(IP → 主机名)的使用场景和限制。
通过主机名获取 IP 地址(正向 DNS 解析)
调用 InetAddress.getByName(String host) 即可发起 DNS 查询。host 可以是域名(如 "www.baidu.com"),也可以是点分十进制 IP 字符串(如 "114.114.114.114")——后者不会触发 DNS,而是直接构造对应地址对象。
- 成功时返回一个 InetAddress 实例,可通过 getHostAddress() 获取标准格式 IP 字符串(如 "180.101.49.12"
- 若 DNS 查询失败(域名不存在、网络不通、DNS 不可达),抛出 UnknownHostException
- 同一个主机名可能对应多个 IP(如 IPv4 + IPv6),getByName 默认只返回其中一个(通常是优先级最高的 A 记录)
批量获取所有 IP 地址(支持多记录场景)
当需要拿到主机名绑定的全部 IPv4 和/或 IPv6 地址时,用 InetAddress.getAllByName(String host):
- 返回 InetAddress 数组,长度 ≥ 1;空数组不会出现,失败仍抛 UnknownHostException
- 例如访问 "www.jd.com" 常返回多个 IPv4 地址,用于客户端负载均衡或容错选路
- 注意:结果顺序不保证稳定,也不代表可用性,实际使用前建议尝试连接或加超时
从 IP 地址反查主机名(反向 DNS)
调用 InetAddress.getByName("1.2.3.4").getHostName() 或直接传入 IP 字符串:InetAddress.getByName("1.2.3.4").getHostName()。但要注意:
立即学习“Java免费学习笔记(深入)”;
- 该方法会尝试做 PTR 查询,但很多公网 IP 没有配置反向 DNS 记录,此时返回的是原始 IP 字符串(不是异常)
- 如果想区分“查到了真实主机名”还是“只是回退到 IP”,可对比 getHostName() 和 getHostAddress() 是否相等
- 反查结果受本地 DNS 配置、防火墙、目标网络策略影响较大,不可依赖其准确性
获取本机地址的常用方式
获取当前机器的 IP 地址有多种写法,推荐如下:
- InetAddress.getLocalHost():最简方式,但可能返回 127.0.0.1(如果 hosts 中 localhost 映射为 loopback)
- 更可靠的做法是遍历所有网卡:NetworkInterface.getNetworkInterfaces(),再对每个接口的 InetAddress 过滤掉 loopback、siteLocal、anyLocal 等非有效地址
- 若只需对外通信使用的默认出口 IP,可尝试连接一个外部地址(如 8.8.8.8:53)后调用 socket.getLocalAddress(),避开 DNS 和 hosts 干扰


















