首页 文章

为什么我的java UDP套接字没有收到所有数据包?

提问于
浏览
-1
MyQueue<DatagramPacket> queue;
while(true){
    udpSocket.receive(receivePacket);
    putReceviedPacketToQueue(receivePacket);
}

我有一个UDP服务器,它接受UDP数据包并将其放入我的自定义实现的队列,如主要存储这些DatagramPackets的数据结构 . This data structure's insert and remove methods are synchronized.

有100个不同的线程处理这些DatagramPackets . 它们从MyQueue同步删除DatagramPacket,然后独立处理该Datagram数据包 .

总的来说,我有101个线程1用于接收UDP数据包,其他100个用于处理它们 .

我的问题是:

  • 从tcpdump,我可以看到有2000个UDP数据包(每个数据包50个字节)在一秒钟内到达服务器 .

  • 但是我的udpSocket .receive(receivePacket)无法接收这2000个数据包 . 有时它只收到1500-1600个数据包 . 但2000个UDP数据包已到达我服务器的网络层(tcpdump显示),但我的应用程序即java UDP套接字无法读取它们 .

我正在测试这个AWS服务器,我的服务器升级到足以处理2000 UDP包/秒 .

我想知道问题可能是什么 . 我的MyQueue插入和删除工具是否花费太多时间或我的100处理线程导致问题或一个线程无法接收2000个数据包/秒?

1 回答

  • 3

    因为UDP是一种不可靠的传输,但也因为如果你要将 DatagramPackets 排队,你将需要一个新的 receive() ,否则接收将覆盖前一个 . 还有一个新的底层 byte[] 数组 .

相关问题