You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3中SocketUtils废弃后,如何查找指定范围的空闲端口?

Spring Boot 3 替代废弃 SocketUtils 的空闲端口查找实现

Spring Boot 3 里 org.springframework.util.SocketUtils 已经被废弃,如果你需要替代 findAvailableTcpPort(int min, int max) 和 findAvailableTcpPorts(int count, int min, int max) 这两个方法,可以用下面的自定义工具类实现——基于JDK原生ServerSocket API,无需额外依赖:

import java.io.IOException;
import java.net.ServerSocket;
import java.util.HashSet;
import java.util.Set;

public class PortUtils {

    // 替代 SocketUtils.findAvailableTcpPort(minimumPortValue, maximumPortValue)
    public static int findAvailableTcpPort(int minPort, int maxPort) {
        if (minPort < 1 || maxPort > 65535 || minPort > maxPort) {
            throw new IllegalArgumentException("端口范围必须在1-65535之间,且最小值不大于最大值");
        }

        for (int port = minPort; port <= maxPort; port++) {
            try (ServerSocket socket = new ServerSocket(port)) {
                // 绑定成功说明端口空闲,关闭Socket后返回端口
                return port;
            } catch (IOException e) {
                // 端口被占用,继续尝试下一个
                continue;
            }
        }

        throw new IllegalStateException(String.format("在端口范围[%d, %d]内未找到空闲TCP端口", minPort, maxPort));
    }

    // 替代 SocketUtils.findAvailableTcpPorts(requestedNumberOfPorts, minimumPortValue, maximumPortValue)
    public static Set<Integer> findAvailableTcpPorts(int count, int minPort, int maxPort) {
        if (count <= 0) {
            throw new IllegalArgumentException("请求的端口数量必须大于0");
        }
        if (minPort < 1 || maxPort > 65535 || minPort > maxPort) {
            throw new IllegalArgumentException("端口范围必须在1-65535之间,且最小值不大于最大值");
        }
        if (maxPort - minPort + 1 < count) {
            throw new IllegalArgumentException("端口范围大小不足以提供请求数量的空闲端口");
        }

        Set<Integer> availablePorts = new HashSet<>();
        while (availablePorts.size() < count) {
            int port = findAvailableTcpPort(minPort, maxPort);
            availablePorts.add(port);
        }

        return availablePorts;
    }
}

关键说明

  • 用try-with-resources自动关闭ServerSocket,确保绑定成功的端口立即释放,不会被占用
  • 遍历端口时捕获IOException,判定端口被占用后继续尝试下一个
  • 加入参数合法性校验,提前抛出异常避免无效遍历
  • 查找多个端口时用HashSet保证端口不重复,直到收集到指定数量的空闲端口

使用示例

// 查找单个空闲端口
int singlePort = PortUtils.findAvailableTcpPort(8080, 9090);
System.out.println("找到空闲端口:" + singlePort);

// 查找3个空闲端口
Set<Integer> ports = PortUtils.findAvailableTcpPorts(3, 8080, 9090);
System.out.println("找到的空闲端口:" + ports);

内容的提问来源于stack exchange,提问作者shalabh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:55:06