java 数据报套接字处理数据的速度不够快

java Datagram Socket not processing data fast enough

我正在我的计算机 (localhost) 上使用 UDP 测试数据传输。在发送端,有一个简单的 while 循环发送 512 字节的数据包。在接收端有一个线程不断地从套接字中读取数据并打印出到目前为止它已经读取的数据包数量。

发送结束:

for (int i = 0; i < 5000; i++) {
    byte[] data = new byte[512];
    try {
        client.socket.send(new DatagramPacket(data, 0, data.length, InetAddress.getByName("localhost"), 4337));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

接收端:

while (true) {
    DatagramPacket packet = new DatagramPacket(input_buffer, input_buffer.length);
    try {
        socket.receive(packet);
        System.out.println("counter = " + l++);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

输出:

... 
counter = 1213
counter = 1214
counter = 1215
counter = 1216
counter = 1217

发送方发送了5000个数据包,但接收方只收到了1217个。

我知道问题在于接收端的处理速度的原因是,如果我通过添加行 Thread.sleep(1);

在发送每个数据包之间等待一毫秒,问题就会消失

有什么办法可以解决这个问题而不增加延迟吗?

Why changing value of SO_RCVBUF doesn't work?

此 post 展示了如何找到 linux 上套接字的最大接收缓冲区大小。在我的例子中,限制太低,因此一些数据包被丢弃。

经过进一步测试,我发现通过 Internet 路由数据包而不是将它们发送到本地主机会引入足够的延迟,从而使所有数据包都得到处理。