1. 概述
互联网协议地址(IP address)是互联网上唯一标识设备的关键。因此,在某些应用中,了解运行我们应用程序的设备的身份至关重要。
在这个教程中,我们将探讨使用Java获取计算机IP地址的各种方法。
2. 获取本地IP地址
首先,让我们看看获取当前机器本地IPv4地址的一些方法。
2.1. 使用Java网络库获取本地地址
这个方法利用Java网络库建立一个UDP连接:
try (final DatagramSocket datagramSocket = new DatagramSocket()) {
datagramSocket.connect(InetAddress.getByName("8.8.8.8"), 12345);
return datagramSocket.getLocalAddress().getHostAddress();
}
为了简化,我们使用Google的主DNS服务器作为目标主机,并提供IP地址 8.8.8.8。Java网络库在此阶段只检查地址格式的有效性,因此地址本身可能无法访问。此外,我们使用随机端口 12345 通过socket.connect()
方法与目标主机建立UDP连接。实际上,它设置了发送和接收数据所需的所有变量,包括机器的本地地址,而无需向目标主机发送任何请求。
尽管这个解决方案在Linux和Windows机器上工作得很好,但在macOS上却存在问题,不能返回预期的IP地址。
2.2. 使用套接字连接获取本地地址
另一种选择是通过可靠的互联网连接使用套接字连接查找IP地址:
try (Socket socket = new Socket()) {
socket.connect(new InetSocketAddress("google.com", 80));
return socket.getLocalAddress().getHostAddress();
}
同样为了简化,我们使用了 google.com,并在端口 80 连接以获取主机地址。只要能访问,我们可以使用任何其他URL创建套接字连接。
2.3. 复杂网络环境中的注意事项
上述方法在简单网络环境中表现良好。然而,当机器有多个网络接口时,行为可能就不那么可预测了。
换句话说,从上述函数返回的IP地址将是机器上首选网络接口的地址,这可能与我们的期望不同。对于特定需求,可以获取连接到服务器的客户端IP地址。
3. 获取公共IP地址
类似于本地IP地址,我们可能想知道当前机器的公共IP地址。公共IP地址是互联网上可达的IPv4地址。此外,它可能不唯一地标识查找地址的机器。例如,同一路由器下的多个主机具有相同的公共IP地址。
简单来说,我们可以连接到Amazon AWS的checkip.amazonaws.com
URL并读取响应:
String urlString = "http://checkip.amazonaws.com/";
URL url = new URL(urlString);
try (BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()))) {
return br.readLine();
}
这种方法大多数时候都能正常工作。然而,我们明确依赖于外部源,其可靠性无法保证。因此,作为备选方案,我们可以使用以下URL之一获取公共IP地址:
4. 总结
在这篇文章中,我们学习了如何在Java中找到当前机器的IP地址以及如何获取它们。我们还探讨了检查本地和公共IP地址的不同方法。
如往常一样,示例代码可以在GitHub上找到。