diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/lang/id/IdUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/lang/id/IdUtil.java
index abcfb36fc..fa6b250b8 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/lang/id/IdUtil.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/lang/id/IdUtil.java
@@ -15,7 +15,7 @@ package org.dromara.hutool.core.lang.id;
import org.dromara.hutool.core.exceptions.UtilException;
import org.dromara.hutool.core.lang.Assert;
import org.dromara.hutool.core.lang.Singleton;
-import org.dromara.hutool.core.net.NetUtil;
+import org.dromara.hutool.core.net.Ipv4Util;
import org.dromara.hutool.core.util.RuntimeUtil;
/**
@@ -189,7 +189,7 @@ public class IdUtil {
long id = 1L;
byte[] mac = null;
try{
- mac = NetUtil.getLocalHardwareAddress();
+ mac = Ipv4Util.getLocalHardwareAddress();
}catch (final UtilException ignore){
// ignore
}
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/net/Ipv4Util.java b/hutool-core/src/main/java/org/dromara/hutool/core/net/Ipv4Util.java
index f9e4e0580..963e75a87 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/net/Ipv4Util.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/net/Ipv4Util.java
@@ -12,14 +12,21 @@
package org.dromara.hutool.core.net;
+import org.dromara.hutool.core.collection.CollUtil;
import org.dromara.hutool.core.collection.ListUtil;
import org.dromara.hutool.core.lang.Assert;
+import org.dromara.hutool.core.lang.Singleton;
import org.dromara.hutool.core.regex.PatternPool;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.core.text.split.SplitUtil;
import org.dromara.hutool.core.util.CharUtil;
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
import java.util.ArrayList;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.regex.Matcher;
@@ -46,6 +53,140 @@ import java.util.regex.Matcher;
*/
public class Ipv4Util implements Ipv4Pool {
+ private static volatile String localhostName;
+
+ /**
+ * 获取主机名称,一次获取会缓存名称
+ * 注意此方法会触发反向DNS解析,导致阻塞,阻塞时间取决于网络!
+ *
+ * @return 主机名称
+ * @since 5.4.4
+ */
+ public static String getLocalHostName() {
+ if(null == localhostName){
+ synchronized (Ipv4Util.class){
+ if(null == localhostName){
+ localhostName = NetUtil.getAddressName(getLocalhostDirectly());
+ }
+ }
+ }
+ return localhostName;
+ }
+
+ /**
+ * 获得本机MAC地址,默认使用获取到的IPv4本地地址对应网卡
+ *
+ * @return 本机MAC地址
+ */
+ public static String getLocalMacAddress() {
+ return MacAddressUtil.getMacAddress(getLocalhost());
+ }
+
+ /**
+ * 获得本机物理地址
+ *
+ * @return 本机物理地址
+ * @since 5.7.3
+ */
+ public static byte[] getLocalHardwareAddress() {
+ return MacAddressUtil.getHardwareAddress(getLocalhost());
+ }
+
+ /**
+ * 获取本机网卡IPv4地址,规则如下:
+ *
+ *
+ * 此方法不会抛出异常,获取失败将返回{@code null}
+ *
+ * 见:https://github.com/dromara/hutool/issues/428 + * + * @return 本机网卡IP地址,获取失败返回{@code null} + */ + public static InetAddress getLocalhost() { + return Singleton.get(Ipv4Util.class.getName(), Ipv4Util::getLocalhostDirectly); + } + + /** + * 获取本机网卡IPv4地址,不使用缓存,规则如下: + * + *
+ * 此方法不会抛出异常,获取失败将返回{@code null}
+ *
+ * 见:https://github.com/dromara/hutool/issues/428
+ *
+ * @return 本机网卡IP地址,获取失败返回{@code null}
+ */
+ public static InetAddress getLocalhostDirectly() {
+ final LinkedHashSet
* 此方法不会抛出异常,获取失败将返回{@code null}
- * 见:https://github.com/dromara/hutool/issues/428
+ * 见:https://github.com/dromara/hutool/issues/428
*
* @return 本机网卡IP地址,获取失败返回{@code null}
- * @since 3.0.1
*/
- public static InetAddress getLocalhost() {
- final LinkedHashSet
+ * 当host中包含端口时(用“:”隔开),使用host中的端口,否则使用默认端口
+ * 给定host为空时使用本地host(127.0.0.1)
+ *
+ * @param host Host
+ * @param defaultPort 默认端口
+ * @return InetSocketAddress
+ */
+ public static InetSocketAddress buildInetSocketAddress(String host, final int defaultPort) {
+ if (StrUtil.isBlank(host)) {
+ host = LOCAL_IP;
+ }
+
+ final String targetHost;
+ final int port;
+ final int index = host.indexOf(":");
+ if (index != -1) {
+ // host:port形式
+ targetHost = host.substring(0, index);
+ port = Integer.parseInt(host.substring(index + 1));
+ } else {
+ targetHost = host;
+ port = defaultPort;
+ }
+
+ return new InetSocketAddress(targetHost, port);
+ }
+
/**
* 根据 ip地址 和 掩码地址 获得 CIDR格式字符串
*
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/net/Ipv6Util.java b/hutool-core/src/main/java/org/dromara/hutool/core/net/Ipv6Util.java
new file mode 100644
index 000000000..6f928db57
--- /dev/null
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/net/Ipv6Util.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2023 looly(loolly@aliyun.com)
+ * Hutool is licensed under Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ */
+
+package org.dromara.hutool.core.net;
+
+import java.math.BigInteger;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.LinkedHashSet;
+
+/**
+ * IPv6工具类
+ *
+ * @author looly
+ * @since 6.0.0
+ */
+public class Ipv6Util {
+ /**
+ * 将IPv6地址字符串转为大整数
+ *
+ * @param ipv6Str 字符串
+ * @return 大整数, 如发生异常返回 null
+ */
+ public static BigInteger ipv6ToBigInteger(final String ipv6Str) {
+ try {
+ final InetAddress address = InetAddress.getByName(ipv6Str);
+ if (address instanceof Inet6Address) {
+ return new BigInteger(1, address.getAddress());
+ }
+ } catch (final UnknownHostException ignore) {
+ }
+ return null;
+ }
+
+ /**
+ * 将大整数转换成ipv6字符串
+ *
+ * @param bigInteger 大整数
+ * @return IPv6字符串, 如发生异常返回 null
+ */
+ public static String bigIntegerToIPv6(final BigInteger bigInteger) {
+ try {
+ return InetAddress.getByAddress(
+ bigInteger.toByteArray()).toString().substring(1);
+ } catch (final UnknownHostException ignore) {
+ return null;
+ }
+ }
+
+ /**
+ * 获得本机的IPv6地址列表
+ * 返回的IP列表有序,按照系统设备顺序
+ *
+ * @return IP地址列表 {@link LinkedHashSet}
+ * @since 4.5.17
+ */
+ public static LinkedHashSet
* 来自org.springframework.util.SocketUtils
@@ -300,35 +244,6 @@ public class NetUtil {
return hideIpPart(longToIpv4(ip));
}
- /**
- * 构建InetSocketAddress
- * 当host中包含端口时(用“:”隔开),使用host中的端口,否则使用默认端口
- * 给定host为空时使用本地host(127.0.0.1)
- *
- * @param host Host
- * @param defaultPort 默认端口
- * @return InetSocketAddress
- */
- public static InetSocketAddress buildInetSocketAddress(String host, final int defaultPort) {
- if (StrUtil.isBlank(host)) {
- host = LOCAL_IP;
- }
-
- final String destHost;
- final int port;
- final int index = host.indexOf(":");
- if (index != -1) {
- // host:port形式
- destHost = host.substring(0, index);
- port = Integer.parseInt(host.substring(index + 1));
- } else {
- destHost = host;
- port = defaultPort;
- }
-
- return new InetSocketAddress(destHost, port);
- }
-
/**
* 通过域名得到IP
*
@@ -398,19 +313,6 @@ public class NetUtil {
return toIpList(localAddressList);
}
- /**
- * 获得本机的IPv6地址列表
- * 返回的IP列表有序,按照系统设备顺序
- *
- * @return IP地址列表 {@link LinkedHashSet}
- * @since 4.5.17
- */
- public static LinkedHashSet
+ *
*
- *
- * 1. 查找所有网卡地址,必须非回路(loopback)地址、非局域网地址(siteLocal)、IPv4地址
- * 2. 如果无满足要求的地址,调用 {@link InetAddress#getLocalHost()} 获取地址
- *
*
*
- * 注意此方法会触发反向DNS解析,导致阻塞,阻塞时间取决于网络!
- *
- * @return 主机名称
- * @since 5.4.4
- */
- public static String getLocalHostName() {
- if (StrUtil.isNotBlank(localhostName)) {
- return localhostName;
- }
-
- final InetAddress localhost = getLocalhost();
- if (null != localhost) {
- String name = localhost.getHostName();
- if (StrUtil.isEmpty(name)) {
- name = localhost.getHostAddress();
- }
- localhostName = name;
- }
-
- return localhostName;
+ public static String getLocalMacAddressV4() {
+ return Ipv4Util.getLocalMacAddress();
}
/**
@@ -884,6 +661,24 @@ public class NetUtil {
return infos;
}
+ /**
+ * 获取地址名称,如果无名称返回地址
+ * 如果提供的地址为{@code null}返回{@code null}
+ *
+ * @param address {@link InetAddress},提供{@code null}返回{@code null}
+ * @return 地址名称或地址
+ */
+ public static String getAddressName(final InetAddress address) {
+ if (null == address) {
+ return null;
+ }
+ String name = address.getHostName();
+ if (StrUtil.isEmpty(name)) {
+ name = address.getHostAddress();
+ }
+ return name;
+ }
+
// ----------------------------------------------------------------------------------------- Private method start
// ----------------------------------------------------------------------------------------- Private method end
diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/net/Ipv4UtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/net/Ipv4UtilTest.java
index 2d6244f89..2af24db1c 100644
--- a/hutool-core/src/test/java/org/dromara/hutool/core/net/Ipv4UtilTest.java
+++ b/hutool-core/src/test/java/org/dromara/hutool/core/net/Ipv4UtilTest.java
@@ -1,10 +1,22 @@
package org.dromara.hutool.core.net;
+import org.dromara.hutool.core.regex.PatternPool;
+import org.dromara.hutool.core.regex.ReUtil;
import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
+import java.net.InetAddress;
+
public class Ipv4UtilTest {
+ @Test
+ @Disabled
+ public void getLocalHostNameTest() {
+ // 注意此方法会触发反向DNS解析,导致阻塞,阻塞时间取决于网络!
+ Assertions.assertNotNull(Ipv4Util.getLocalHostName());
+ }
+
@Test
public void formatIpBlockTest() {
for (int i = Ipv4Util.IPV4_MASK_BIT_VALID_MIN; i < Ipv4Util.IPV4_MASK_BIT_MAX; i++) {
@@ -199,4 +211,22 @@ public class Ipv4UtilTest {
Assertions.assertEquals(Ipv4Util.getMaskByMaskBit(i), Ipv4Util.getMaskByIpRange(beginIpStr, endIpStr));
}
}
+
+ @Test
+ @Disabled
+ public void getLocalhostTest() {
+ final InetAddress localhost = Ipv4Util.getLocalhost();
+ Assertions.assertNotNull(localhost);
+ }
+
+ @Test
+ @Disabled
+ public void getLocalMacAddressTest() {
+ final String macAddress = Ipv4Util.getLocalMacAddress();
+ Assertions.assertNotNull(macAddress);
+
+ // 验证MAC地址正确
+ final boolean match = ReUtil.isMatch(PatternPool.MAC_ADDRESS, macAddress);
+ Assertions.assertTrue(match);
+ }
}
diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/net/NetUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/net/NetUtilTest.java
index 16c59679a..eaf9fc58a 100644
--- a/hutool-core/src/test/java/org/dromara/hutool/core/net/NetUtilTest.java
+++ b/hutool-core/src/test/java/org/dromara/hutool/core/net/NetUtilTest.java
@@ -1,14 +1,11 @@
package org.dromara.hutool.core.net;
import org.dromara.hutool.core.lang.Console;
-import org.dromara.hutool.core.regex.PatternPool;
-import org.dromara.hutool.core.regex.ReUtil;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import java.net.HttpCookie;
-import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.List;
@@ -23,28 +20,10 @@ public class NetUtilTest {
@Test
@Disabled
public void getLocalhostStrTest() {
- final String localhost = NetUtil.getLocalhostStr();
+ final String localhost = NetUtil.getLocalhostStrV4();
Assertions.assertNotNull(localhost);
}
- @Test
- @Disabled
- public void getLocalhostTest() {
- final InetAddress localhost = NetUtil.getLocalhost();
- Assertions.assertNotNull(localhost);
- }
-
- @Test
- @Disabled
- public void getLocalMacAddressTest() {
- final String macAddress = NetUtil.getLocalMacAddress();
- Assertions.assertNotNull(macAddress);
-
- // 验证MAC地址正确
- final boolean match = ReUtil.isMatch(PatternPool.MAC_ADDRESS, macAddress);
- Assertions.assertTrue(match);
- }
-
@Test
public void longToIpTest() {
final String ipv4 = NetUtil.longToIpv4(2130706433L);
@@ -77,16 +56,9 @@ public class NetUtilTest {
Assertions.assertEquals("cookiedomain.com", httpCookie.getDomain());
}
- @Test
- @Disabled
- public void getLocalHostNameTest() {
- // 注意此方法会触发反向DNS解析,导致阻塞,阻塞时间取决于网络!
- Assertions.assertNotNull(NetUtil.getLocalHostName());
- }
-
@Test
public void getLocalHostTest() {
- Assertions.assertNotNull(NetUtil.getLocalhost());
+ Assertions.assertNotNull(NetUtil.getLocalhostV4());
}
@Test
diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/digest/mac/BCMacEngine.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/digest/mac/BCMacEngine.java
index f5f84a8d5..95b59da36 100644
--- a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/digest/mac/BCMacEngine.java
+++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/digest/mac/BCMacEngine.java
@@ -59,7 +59,7 @@ public class BCMacEngine implements MacEngine {
*
* @return {@link Mac}
*/
- public Mac getMac() {
+ public Mac ipgetMac() {
return mac;
}
diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/management/HostInfo.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/management/HostInfo.java
index ace376f83..ab5e9e4f4 100644
--- a/hutool-extra/src/main/java/org/dromara/hutool/extra/management/HostInfo.java
+++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/management/HostInfo.java
@@ -27,7 +27,7 @@ public class HostInfo implements Serializable {
private final String HOST_ADDRESS;
public HostInfo() {
- final InetAddress localhost = NetUtil.getLocalhost();
+ final InetAddress localhost = NetUtil.getLocalhostV4();
if(null != localhost){
HOST_NAME = localhost.getHostName();
HOST_ADDRESS = localhost.getHostAddress();