首页 > 解决方案 > java Datagram Socket处理数据的速度不够快

问题描述

我正在我的计算机(本地主机)上使用 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);

有没有什么办法可以在不增加延迟的情况下解决这个问题?

标签: javasocketsnetworkingudp

解决方案


为什么更改 SO_RCVBUF 的值不起作用?

这篇文章展示了如何在 Linux 上找到套接字的最大接收缓冲区大小。在我的情况下,限制太低,因此一些数据包被丢弃。

经过进一步测试,我发现通过 Internet 路由数据包而不是将它们发送到 localhost 会引入足够的延迟,以便处理所有数据包。


推荐阅读