【问题标题】:Java UDP Socket receiving intermittentlyJava UDP Socket 间歇性接收
【发布时间】:2011-12-13 19:58:31
【问题描述】:

1) 我有一个程序通过 UDP 将数据从一台服务器发送到另一台服务器。

2) 另一个程序接收这些,并通过 UDP 将它们简单地转发到多个目的地,通过 UDP。

3) 目的地之一是本地主机。

数据在 2) 中被接收并以不间断的恒定流被发送到 3)。然而,在 3) 中从 2) 接收数据包的应用程序正在间歇性地接收。它将接收数据 20 秒,然后几分钟不接收,并以看似随机的方式继续。

当从外部接收数据包时,此 SAME 代码可以完美运行。此外,如果我在 3) 正在侦听的端口上运行 tcpdump -i lo,则实际上有恒定的数据流到达该端口。

我不明白问题出在哪里?

-史蒂夫

【问题讨论】:

  • 嗯,我认为首先要提到的是 udp 是无状态的,而不是流。所以丢包对于udp来说是正常的。我建议在局域网上测试你的情况,所有节点都通过以太网插入。
  • 向我们展示接收代码。 “几分钟”在网络世界中是永恒的。
  • 我对“丢弃数据包对于 udp 来说是正常的”@owen 存在问题。我认为应该是“不能保证接收所有数据包”。像 Nikolai 提到的那样长时间丢弃数据包是非常不寻常的。要么这是线程问题,要么正在发生其他事情。
  • 可能是 localhost UDP 缓冲区溢出@Steve。我们在这里谈论的是什么类型的音量?每秒多少个数据包?

标签: java sockets udp


【解决方案1】:

当您在 TCP 中发送数据时,您不必担心流量控制,因为 TCP 会为您完成 - 您可以随心所欲地发送数据,如果发送速度过快, write 方法将阻塞。

在 UDP 中情况并非如此,您的数据包写入将完成并立即返回,但如果您发送太多数据包太快,它只会被丢弃。这可能发生在从您的操作系统到所有路由器和网络设备再到另一台机器的任何地方。

因此,您需要有一些自己限制数据包流的方案。要测试这是否是问题,只需在每次发送之间弹出一个睡眠。如果你发现每秒发送 1 个数据包或每秒发送 10 个数据包,它们都通过了,那么当你移除睡眠时,你会回到 20 秒 OK,几分钟内什么都没有,你知道这是因为你的流量控制不足。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多