自定义端口池解决端口占用

645 阅读1分钟

前言

最近实现一个UDP发送数据的需求,前端发送请求数据到服务端,服务端接受数据后使用UDP发送到其他设备。当多个请求上来,前一个请求还没发送完还占用端口,这时又来一个请求再发送数据会出现端口绑定异常。

思路

  • 限流控制,每次只允许有一个请求发送(不符合业务需求)
  • 自定义端口池管理端口资源,从端口池取,用完放回

实现

  • Java简单实现
public class PortPool {

    // 保存端口
    private static final Set<Integer> pool = new HashSet<>(526);

    private static volatile boolean init = false;

    public static Integer get() {
        Iterator<Integer> iterator = pool.iterator();
        if (pool.isEmpty() || !iterator.hasNext()) {
            throw new RuntimeException("端口用尽,请稍后重试");
        }
        Integer port = iterator.next();
        pool.remove(port);
        return port;
    }

    public static void recycle(Integer port) {
        if (port > 0 && !pool.contains(port)) {
            pool.add(port);
        }
    }

    // 端口范围可从配置指定
    public static void init(Integer start, Integer end) {
        init = true;
        for (int i = start; i < end; i++) {
            pool.add(i);
        }
    }


    public static boolean hasInit() {
        return init;
    }

}
  • 每次UDP创建Socket绑定的端口从端口池获取
  • UDP发送完数据释放端口后把端口放回端口池

结尾

如果文章对你有帮助,请点个 👍🏻 支持一下