在开发过程中,获取当前机器的 IP 地址是一个非常常见的需求。无论是应用部署时需要知道服务监听的地址,还是在开发测试中需要确认应用的访问地址,都需要可靠地获取当前机器的 IP 地址信息。
Java 标准库中提供 InetAddress
类来获取 IP 地址,但使用起来还是比较繁琐的。而 Hutool 作为一个强大的 Java 工具集,其中就提供非常便捷的 IP 地址获取方法。接下来,我们就详细探讨一下如何使用 Hutool 获取当前机器的所有 IP 地址,以及如何区分 IPv4 和 IPv6 地址。
Hutool 提供 NetUtil.getLocalIpv4s()
和 NetUtil.getLocalIpv6s()
两个方法,分别用于获取当前机器的所有 IPv4 和 IPv6 地址。我们可以将这两个方法的调用组合起来,就可以获取所有的 IP 地址。示例代码如下:
List<String> ipv4List = NetUtil.getLocalIpv4s();
List<String> ipv6List = NetUtil.getLocalIpv6s();
// 合并 IPv4 和 IPv6 地址
List<String> allIpList = new ArrayList<>(ipv4List);
allIpList.addAll(ipv6List);
System.out.println("所有 IP 地址列表: " + allIpList);
通过这段代码,我们可以获取当前机器的所有 IP 地址,包括 IPv4 和 IPv6 地址。需要注意的是,机器没有配置 IPv6 地址,那么 NetUtil.getLocalIpv6s()
方法会返回一个空列表。
有时我们可能只需要获取特定类型的 IP 地址,比如只需要 IPv4 地址或只需要 IPv6 地址。这时,我们可以使用 Hutool 提供的 NetUtil.isIpv4(String ip)
和 NetUtil.isIpv6(String ip)
方法来判断 IP 地址的类型。示例代码如下:
List<String> allIpList = NetUtil.getLocalIpAddress();
List<String> ipv4List = new ArrayList<>();
List<String> ipv6List = new ArrayList<>();
for (String ip : allIpList) {
if (NetUtil.isIpv4(ip)) {
ipv4List.add(ip);
} else if (NetUtil.isIpv6(ip)) {
ipv6List.add(ip);
}
}
System.out.println("IPv4 地址列表: " + ipv4List);
System.out.println("IPv6 地址列表: " + ipv6List);
在这个例子中,我们首先使用 NetUtil.getLocalIpAddress()
方法获取所有的 IP 地址,遍历这个列表,使用 NetUtil.isIpv4()
和 NetUtil.isIpv6()
方法判断每个 IP 地址的类型,并将它们分别添加到 IPv4 和 IPv6 地址列表中。这样我们就可以分别获取 IPv4 和 IPv6 地址。
需要注意的是,对于某些特殊的 IP 地址,比如 loopback 地址 (127.0.0.1 和 ::1),Hutool 也将其识别为合法的 IP 地址。您只需要获取可用于访问的 IP 地址,可以在遍历 IP 地址列表时,额外判断一下地址是否为 loopback 地址。
除获取 IP 地址列表,Hutool 还提供一些其他的 IP 地址相关方法,比如:
NetUtil.isInnerIP(String ipAddress)
: 判断 IP 地址是否为内网 IP 地址NetUtil.isMatchIpv4(String ipAddress)
: 检测字符串是否为合法的 IPv4 地址NetUtil.isMatchIpv6(String ipAddress)
: 检测字符串是否为合法的 IPv6 地址NetUtil.getInternetIp()
: 获取当前机器的公网 IP 地址这些方法都可以帮助我们更好地处理 IP 地址相关的需求。
Hutool 为我们提供非常便捷的 IP 地址获取和处理方法。使用这些方法,我们可以轻松地获取当前机器的所有 IP 地址,并且还能区分 IPv4 和 IPv6 地址。Hutool 还提供其他一些有用的 IP 地址相关方法,如判断 IP 地址是否为内网 IP、获取公网 IP 等。这些方法大大简化 IP 地址处理的开发工作,提高开发效率。