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
相关产品推荐
相关产品推荐

