1. 概述

IP地址是连接到计算机网络的每个设备的唯一标识符,它允许设备在互联网上相互通信。本文将探讨在Java中获取URL的IP地址的几种方法。

2. IP地址类型

IP地址主要有两个版本:IPv4和IPv6。IPv4由32位组成,表示为四个点分隔的数字(如192.168.1.1)。IPv6使用128位,表示为八组冒号分隔的十六进制数字(如2001:0db8:85a3:0000:0000:8a2e:0370:7334)。本文将重点讨论IPv4。

3. 获取IP地址的常用方法

3.1. 使用InetAddress类

InetAddress类提供了将主机名解析为IP地址的简单方法。我们创建URL字符串,使用InetAddress.getByName()方法解析,最后通过getHostAddress()方法获取IP地址。

String getByInetAddress(String urlString) throws UnknownHostException {
    InetAddress ip = InetAddress.getByName(urlString);
    return ip.getHostAddress();
}

InetAddress.getByName(urlString)接收URL参数并解析为IP地址,getHostAddress()以可读格式返回IP地址。

验证方法有效性的单元测试:

@Test
void givenValidURL_whenGetByInetAddress_thenReturnAValidIPAddress() throws UnknownHostException {
    URLIPAddress urlipAddress = new URLIPAddress();
    assertTrue(validate(urlipAddress.getByInetAddress("www.example.com")));
}

3.2. 使用Socket连接

通过Socket连接获取本地IP地址的方法,能确定系统与外部服务器通信时使用的确切IP地址。创建到外部服务器的Socket连接后,可获取该连接使用的本地IP地址。

String getBySocketConnection(String urlString) throws IOException {
    try (Socket socket = new Socket()) {
        socket.connect(new InetSocketAddress(urlString, 80));
        return socket.getLocalAddress().getHostAddress();
    }
}

⚠️ 注意:此方法假设目标URL开放80端口且可通过互联网访问。其他端口只要开放且可达也可使用。

Socket类的getLocalAddress()方法获取与连接关联的IP地址,getHostAddress()将其转换为字符串格式。

验证google.com连接的单元测试:

@Test
void givenValidURL_whenGetBySocketConnection_thenReturnAValidIPAddress() throws IOException {
    URLIPAddress urlipAddress = new URLIPAddress();
    assertTrue(validate(urlipAddress.getBySocketConnection("google.com")));
}

测试通过URLIPAddress实例调用方法,validate()检查返回字符串是否为有效IP格式(如192.168.1.1)。

3.3. 使用第三方库

当Java标准库功能不足时,可考虑第三方库:

常用库推荐

  • Apache Commons Lang:提供Java对象操作工具
  • Google Guava:高度优化的工具方法和集合
  • OkHttp:适用于Android和Java的健壮HTTP客户端

这些库能简化网络操作等任务,使代码更简洁易维护。例如:

// OkHttp示例(需添加依赖)
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
    .url("http://" + urlString)
    .build();
try (Response response = client.newCall(request).execute()) {
    return response.request().url().host(); // 获取主机信息
}

4. 总结

在Java中获取URL的IP地址有多种方式:

  • InetAddress:简单直接,适合基础需求
  • Socket连接:精确获取本地通信IP
  • 第三方库:提供更丰富的网络操作功能

根据具体场景选择合适方法,避免踩坑。对于简单需求,InetAddress通常足够;复杂场景可考虑Socket或第三方库。


原始标题:Finding IP Address of a URL in Java | Baeldung