【问题标题】:Blocking java UDP DatagramSocket send阻止java UDP DatagramSocket发送
【发布时间】:2021-12-01 11:07:21
【问题描述】:

我正在构建一个客户端/服务器类型的应用程序,客户端将在其中发送数百万条消息。我有一个线程,其目的只是通过 DatagramSocket 发送数据包。问题是,现在,线程正在调用 send() 方法的类型太多,以至于由于内部发送缓冲区已满,一些数据包被丢弃。

如果缓冲区已满,有没有办法在 java 上让 DatagramSocket 对象的这个 send() 调用块,以便不丢弃数据包?

【问题讨论】:

  • 您知道数据报无论如何都不能保证交付吗? UDP 中的 U 告诉你这一点。所以发送端的起搏不一定是一个完整的解决方案。
  • 你找错树了。由于发送缓冲区已满,因此不会丢弃数据包。这会导致DatagramSocket.send() 阻止。请参阅 Javadoc。数据包被丢弃是因为 UDP 可以随时随地丢弃它们,包括发送主机、任何中间路由器和接收主机。要么加快您的 接收器 的速度,要么不发送这么快,或两者兼而有之,或者使用具有节奏的可靠协议。

标签: java sockets udp


【解决方案1】:

您可以使用DatagramChannel 而不是直接创建套接字。

通道可以设置为阻塞模式,根据send的描述,意味着调用将等待直到缓冲区空间可用。

【讨论】:

  • 请注意,这不会消除您进行传输调步的需要,以防止发送数据过快而导致数据报被丢弃。
  • @DavidSchwartz - 对,“UDP”中的“U”又出现了。途中的任何人都可以丢弃数据报。 (这也表明需要在互联网上进行测试,而不仅仅是在单段 LAN 上)。
  • 这不是解决方案。它根本没有任何区别。 DatagramSocket 已经处于阻塞模式,因此它已经具有完全相同的属性。注意 UDP 中的“U”代表“用户”,而不是“不可靠”。请参阅 RFC。
  • 啊,好的。对于所描述的问题,我接受了 OP 的话。
  • 您的答案的问题不是 OP 的错误假设:DatagramSocket.send() 和阻塞 DatagramSocketChannel.send() 在这方面完全没有任何区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多