InetAddress 是 Java 中表示 IP 地址的核心类,通过静态工厂方法创建,支持 IPv4/IPv6,可解析域名、获取本机地址、判断地址类型,但无法获取外网 IP,需依赖外部服务。

InetAddress 是 Java 中用于表示 IP 地址(IPv4 或 IPv6)的核心类,它不直接提供创建实例的构造方法,而是通过静态工厂方法获取。它封装了主机名与 IP 地址的映射关系,常用于网络编程中解析、验证和获取地址信息。
获取本机 IP 地址
调用 InetAddress.getLocalHost() 可以获取当前主机的 InetAddress 实例,但要注意:它返回的是系统默认网络接口绑定的地址,不一定是你期望的“对外 IP”。
- 可能返回
127.0.0.1(localhost)或内网地址(如192.168.x.x),取决于系统 hosts 配置和网络设置 - 若需获取真实外网出口 IP,需通过 HTTP 请求第三方服务(如
https://api.ipify.org),InetAddress 本身无法做到 - 示例代码:
InetAddress local = InetAddress.getLocalHost();
System.out.println(local.getHostAddress()); // 输出类似 192.168.1.5
根据域名解析 IP 地址
使用 InetAddress.getByName(String host) 或 InetAddress.getAllByName(String host) 进行 DNS 解析:
-
getByName返回首个可用 IP(通常为 IPv4,除非系统优先启用 IPv6) -
getAllByName返回所有解析结果(含 IPv4 和 IPv6 多个地址),适合需要兼容多协议的场景 - 若域名不存在或 DNS 不可达,会抛出
UnknownHostException,必须捕获处理 - 示例:
InetAddress addr = InetAddress.getByName("www.baidu.com");
System.out.println(addr.getHostAddress()); // 如 180.101.49.12
判断 IP 地址类型与有效性
InetAddress 提供多个便捷方法识别地址性质:
立即学习“Java免费学习笔记(深入)”;
-
isAnyLocalAddress():是否为通配地址(如0.0.0.0) -
isLoopbackAddress():是否为回环地址(如127.0.0.1或::1) -
isLinkLocalAddress():是否为链路本地地址(如169.254.x.x或fe80::/10) -
isMCGlobal()/isMCNodeLocal():判断是否为特定范围的组播地址 - 注意:InetAddress 不校验字符串格式合法性——传入非法字符串(如
"999.999.999.999")会在解析时抛异常,而非静默失败
从字节数组或字符串构造 InetAddress
可通过 InetAddress.getByAddress(byte[] addr) 或 InetAddress.getByAddress(String host, byte[] addr) 构造已知二进制格式的地址:
- 字节数组长度必须为 4(IPv4)或 16(IPv6),否则抛
UnknownHostException - 字节按网络字节序(大端)排列,Java 中
byte是有符号类型,需注意负值(如(byte)255表示0xFF) - 示例(构造 127.0.0.1):
byte[] ip = {(byte)127, 0, 0, 1};
InetAddress loopback = InetAddress.getByAddress(ip);










