NetUtil
NetUtil是Hutool中用于处理网络相关操作的核心工具类,提供了丰富的网络操作功能,包括端口检测、网络连接、本地IP获取等。
# 主要功能
- IP地址处理:IP地址的解析、转换、验证等
- 端口管理:端口检测、可用端口获取等
- 网络连接:TCP/UDP连接检测、代理连接等
- 本地网络信息:本地IP、MAC地址获取等
- URL处理:URL的解析、编码、解码等
- DNS解析:域名解析等
# IP地址处理
# longToIpv4(long longIP)
将long类型的IP地址转换为IPv4地址字符串。
String ip = NetUtil.longToIpv4(3232235777L);
// 输出: 192.168.1.1
# ipv4ToLong(String strIP)
将IPv4地址字符串转换为long类型。
long ipLong = NetUtil.ipv4ToLong("192.168.1.1");
// 输出: 3232235777
# isInnerIP(String ip)
判断是否为内网IPv4地址。
boolean isInner = NetUtil.isInnerIP("192.168.1.1");
// 输出: true
boolean isInner2 = NetUtil.isInnerIP("202.103.24.68");
// 输出: false
# getLocalhost()
获取本地主机对象。
InetAddress localhost = NetUtil.getLocalhost();
// 输出: localhost/127.0.0.1
# getLocalhostStr()
获取本地IP地址字符串。
String localIp = NetUtil.getLocalhostStr();
// 输出: 192.168.1.100
# 端口管理
# isValidPort(int port)
判断端口是否有效(0~65535)。
boolean isValid = NetUtil.isValidPort(8080);
// 输出: true
boolean isValid2 = NetUtil.isValidPort(70000);
// 输出: false
# isUsableLocalPort(int port)
检测本地端口是否可用。
boolean isUsable = NetUtil.isUsableLocalPort(8080);
// 输出: true
# getUsableLocalPort()
查找1024~65535范围内的可用端口。
int port = NetUtil.getUsableLocalPort();
// 输出: 可用的随机端口(如:1025)
# getUsableLocalPort(int minPort)
查找指定最小值以上的可用端口。
int port = NetUtil.getUsableLocalPort(8000);
// 输出: 8000以上的可用端口
# getUsableLocalPort(int minPort, int maxPort)
查找指定范围内的可用端口。
int port = NetUtil.getUsableLocalPort(8000, 9000);
// 输出: 8000~9000之间的可用端口
# getUsableLocalPorts(int numRequested, int minPort, int maxPort)
获取多个本地可用端口。
TreeSet<Integer> ports = NetUtil.getUsableLocalPorts(3, 8000, 9000);
// 输出: [8000, 8001, 8002](示例,实际为随机可用端口)
# 网络连接
# isOpen(String host, int port)
检测远程主机端口是否开放。
boolean isOpen = NetUtil.isOpen("www.baidu.com", 80);
// 输出: true
boolean isOpen2 = NetUtil.isOpen("www.baidu.com", 8888);
// 输出: false
# isOpen(String host, int port, int timeout)
检测远程主机端口是否开放,自定义超时时间。
boolean isOpen = NetUtil.isOpen("www.baidu.com", 80, 5000);
// 输出: true
# connect(String host, int port)
创建Socket连接。
try (Socket socket = NetUtil.connect("www.baidu.com", 80)) {
// 连接成功,可以进行后续操作
Console.log("连接成功");
} catch (IOException e) {
// 连接失败
Console.log("连接失败: " + e.getMessage());
}
# connect(String host, int port, int timeout)
创建Socket连接,自定义超时时间。
try (Socket socket = NetUtil.connect("www.baidu.com", 80, 5000)) {
// 连接成功,可以进行后续操作
Console.log("连接成功");
} catch (IOException e) {
// 连接失败
Console.log("连接失败: " + e.getMessage());
}
# 本地网络信息
# getLocalMacAddress()
获取本地MAC地址。
String mac = NetUtil.getLocalMacAddress();
// 输出: 00:00:00:00:00:00(示例)
# getLocalMacAddressStr()
获取本地MAC地址字符串,格式为无分隔符的十六进制。
String macStr = NetUtil.getLocalMacAddressStr();
// 输出: 000000000000(示例)
# getNetworkInterfaces()
获取所有网络接口。
Enumeration<NetworkInterface> interfaces = NetUtil.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface networkInterface = interfaces.nextElement();
Console.log(networkInterface.getName());
}
# URL处理
# normalize(String url)
标准化URL,补全协议头。
String normalizedUrl = NetUtil.normalize("www.baidu.com");
// 输出: http://www.baidu.com
String normalizedUrl2 = NetUtil.normalize("https://www.baidu.com");
// 输出: https://www.baidu.com
# encode(String url)
URL编码。
String encodedUrl = NetUtil.encode("http://www.baidu.com?name=测试");
// 输出: http://www.baidu.com?name=%E6%B5%8B%E8%AF%95
# decode(String url)
URL解码。
String decodedUrl = NetUtil.decode("http://www.baidu.com?name=%E6%B5%8B%E8%AF%95");
// 输出: http://www.baidu.com?name=测试
# DNS解析
# lookupDomain(String domain)
解析域名,获取对应的IP地址列表。
List<String> ips = NetUtil.lookupDomain("www.baidu.com");
// 输出: [14.215.177.39, 14.215.177.38]
# reverseLookup(String ip)
反向DNS解析,根据IP地址获取域名。
String domain = NetUtil.reverseLookup("14.215.177.39");
// 输出: 可能为空或对应的域名
# 代理支持
# createProxy(String host, int port)
创建HTTP代理。
Proxy proxy = NetUtil.createProxy("127.0.0.1", 8080);
// 可以用于URLConnection或HttpClient
# createProxy(String host, int port, String username, String password)
创建带认证的HTTP代理。
Proxy proxy = NetUtil.createProxy("127.0.0.1", 8080, "username", "password");
// 可以用于URLConnection或HttpClient
# 注意事项
- 网络连接:网络操作可能会抛出IOException,需要注意异常处理
- 超时设置:进行远程主机操作时,建议设置合理的超时时间,避免长时间阻塞
- 权限问题:某些操作(如获取MAC地址)可能需要管理员权限
- DNS解析:DNS解析结果可能会有缓存,导致获取的IP地址不是最新的
- 端口范围:有效端口范围是0~65535,其中0~1023是系统保留端口
# 总结
NetUtil提供了丰富的网络操作功能,涵盖了IP地址处理、端口管理、网络连接、本地网络信息获取、URL处理和DNS解析等多个方面。通过使用NetUtil,可以大大简化Java中的网络操作,提高开发效率。
无论是网络诊断、IP地址管理还是网络连接,NetUtil都能提供简洁高效的解决方案。