【发布时间】:2021-12-01 11:07:21
【问题描述】:
我正在构建一个客户端/服务器类型的应用程序,客户端将在其中发送数百万条消息。我有一个线程,其目的只是通过 DatagramSocket 发送数据包。问题是,现在,线程正在调用 send() 方法的类型太多,以至于由于内部发送缓冲区已满,一些数据包被丢弃。
如果缓冲区已满,有没有办法在 java 上让 DatagramSocket 对象的这个 send() 调用块,以便不丢弃数据包?
【问题讨论】:
-
您知道数据报无论如何都不能保证交付吗? UDP 中的 U 告诉你这一点。所以发送端的起搏不一定是一个完整的解决方案。
-
你找错树了。由于发送缓冲区已满,因此不会丢弃数据包。这会导致
DatagramSocket.send()阻止。请参阅 Javadoc。数据包被丢弃是因为 UDP 可以随时随地丢弃它们,包括发送主机、任何中间路由器和接收主机。要么加快您的 接收器 的速度,要么不发送这么快,或两者兼而有之,或者使用具有节奏的可靠协议。