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

时间:2018-01-30 06:47:58

标签: java multithreading networking udp

MyQueue<DatagramPacket> queue;
while(true){
    udpSocket.receive(receivePacket);
    putReceviedPacketToQueue(receivePacket);
}

我有一个UDP服务器,它接受UDP数据包并将其放入我自定义实现的队列中,就像主要存储这些DatagramPackets的数据结构一样。 此数据结构的插入和删除方法已同步。

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

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

我的问题是:

  1. 从tcpdump,我可以看到有2000个UDP数据包(每个数据包50个字节)在一秒钟内到达服务器。
  2. 但是我的udpSocket .receive(receivePacket)无法接收这2000个数据包。有时它只收到1500-1600个数据包。但2000个UDP数据包已经到达我服务器的网络层(tcpdump显示),但是我的应用程序即java UDP套接字无法读取它们。
  3. 我正在测试这个AWS服务器,我的服务器升级到足以处理2000 UDP数据包/秒。

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

1 个答案:

答案 0 :(得分:3)

因为UDP是一种不可靠的传输,但也因为如果要将print(A(0,2))入队,则每DatagramPackets需要一个新的,否则接收将覆盖前一个。还有一个新的基础receive()数组。