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或第三方库。