克伦留索夫 2022-06-08 11:37 采纳率: 80%
浏览 141
已结题

关于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条回答

      报告相同问题?

      相关推荐 更多相似问题

      问题事件

      • 系统已结题 6月16日
      • 已采纳回答 6月8日
      • 创建了问题 6月8日

      悬赏问题

      • ¥20 苹果app名字侵权商标,我投诉了,但是苹果一直没回怎么办
      • ¥15 Android studio运行不成功总是报错
      • ¥15 pycharm 加载软件包列表时出错connect timed out
      • ¥20 数字方面的问题,请给个思路
      • ¥15 和您碰到了同一个问题
      • ¥15 如何在微信支付V3PHP版请求中添加header?
      • ¥15 在数字信号处理中用MATLAB显示波形。
      • ¥15 keil MDK软件进行仿真调试的局限
      • ¥15 关于gateway产生临时文件夹的问题
      • ¥15 Java Broken Pipe以及OOM