前言
最近实现一个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
发送完数据释放端口后把端口放回端口池
结尾
如果文章对你有帮助,请点个 赞👍🏻 支持一下