Java里的InetAddress类如何使用_JavaIP地址获取方式解析

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 提供多个便捷方法识别地址性质:

  • isAnyLocalAddress():是否为通配地址(如 0.0.0.0
  • isLoopbackAddress():是否为回环地址(如 127.0.0.1::1
  • isLinkLocalAddress():是否为链路本地地址(如 169.254.x.xfe80::/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);