克伦留索夫
2022-06-08 11:37
采纳率: 80%
浏览 43

关于JAVA SOCKET UDP的高并发丢包问题

问题遇到的现象和发生背景

我在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以内数据,超过就会丢包。

我想要达到的结果

能够支撑不丢包的情况

2条回答 默认 最新

相关推荐 更多相似问题