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);在发送每个数据包之间等待一毫秒,问题就会消失

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

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

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

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

最新更新