问题遇到的现象和发生背景
我在springboot启动类上开了一个线程,用来监听本地端口9072收到的udp包数据,并且将数据进行封装后续操作,
并发不是很高的时候没问题,但是高并发之后一直丢包,我一次性发的数据(0延迟,一起发)条数超过500左右的时候,控制台就显示直接到了500条数据,后续的包都没有获取到,请问这个问题要怎么处理,求指点。
问题相关代码,请勿粘贴截图
public UDPProcess(final int port) throws SocketException {
//创建服务器端DatagramSocket,指定端口
socket = new DatagramSocket(port);
}
@Override
public void run() {
while (true) {
byte[] buffer = new byte[MAX_UDP_DATA_SIZE];
packet = new DatagramPacket(buffer, buffer.length);
try {
log.info("waiting udp data!");
socket.receive(packet);
new Thread(new sumNum(packet)).start();
// ThreadPoolTaskExecutor executor = ApplicationContextUtil.getBean(ThreadPoolTaskExecutor.class);
// executor.execute(new Process(packet));
} catch (IOException e) {
e.printStackTrace();
}
}
}
class sumNum implements Runnable {
private String data;
sumNum(DatagramPacket packet) throws UnsupportedEncodingException {
this.data = new String(packet.getData(), "UTF-8").trim();
}
@Override
public void run() {
System.out.println(data);
RedisTemplate redis = (RedisTemplate) ApplicationContextUtil.getBeanByName("RedisTemplate");
redis.opsForValue().increment("ss", 1);
}
}
运行结果及报错内容
我的解答思路和尝试过的方法
我在启动类上启动了一个线程用来监控数据,没收到数据前,此线程会被阻塞,收到数据之后,新开一个线程,把数据交给新线程并回去继续监控,之前想过搞多个线程一起监控,可以提高并发,但是开多个线程之后就会报错,端口已被占用的问题。现在上面的代码只能接收到并发条数500以内数据,超过就会丢包。
我想要达到的结果
能够支撑不丢包的情况