java - 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);
有没有什么办法可以在不增加延迟的情况下解决这个问题?
解决方案
这篇文章展示了如何在 Linux 上找到套接字的最大接收缓冲区大小。在我的情况下,限制太低,因此一些数据包被丢弃。
经过进一步测试,我发现通过 Internet 路由数据包而不是将它们发送到 localhost 会引入足够的延迟,以便处理所有数据包。
推荐阅读
- python - 修复 tkinter 中小部件的位置
- regex - Pandas 系列子字符串以字母开头和结尾
- node.js - 使用 foreach nodejs 时 async/await 的结果
- java - Java函数没有返回预期值
- shell - 无法从 Makefile 调用函数
- kubernetes - 节点成功加入主节点,但当 kubectl get nodes “与服务器 localhost:8080 的连接被拒绝”时出错
- windows - CoCreateInstance 返回“未注册 REGDB_E_CLASSNOTREG 类”
- c++ - 为什么显示 QProgressDialog 时没有显式调用 `exec()` 或 `show()`?
- visualization - Graphviz:左右子图,子图中的左右
- c# - Blazor 触发自定义验证消息