【问题标题】:Java UDP programmingJava UDP 编程
【发布时间】:2011-11-19 08:44:22
【问题描述】:

这是我第一次涉足 UDP 套接字编程。在不深入了解程序细节的情况下,服务器基本上会向客户端发送 n 条设定大小的消息。我已经编写并运行了代码,看起来我的所有消息都按照服务器发送它们的顺序传递到客户端。这有道理吗?据我了解,使用 UDP,发送的数据包并不总是传递,也不总是以相同的顺序传递。如果是这样,那么为什么客户端程序以相同的顺序接收所有服务器消息并且永远不会丢失任何消息?我尝试了不同的消息编号(例如发送 200 或 500 条消息)和不同的消息大小。我没有使用线程或类似的东西。只需为服务器设置一个循环以逐个发送数据包,而客户端只是在无限循环中等待接收它们。来自更有经验的人的见解将非常有帮助!

【问题讨论】:

  • 仅仅因为你可以丢包并不意味着你会这样做。尝试尽可能快地发送几百万个数据包,并测量是否丢失。重新排序通常发生在路由器上,尤其是当它对数据包进行负载平衡时。

标签: java network-programming udp


【解决方案1】:

UDP 不保证交付或按顺序交付。这并不意味着它不会,尤其是在您的情况下,我假设您的客户端和服务器在同一台机器上(或在同一本地网络上)。

【讨论】:

    【解决方案2】:

    这主要取决于您的操作系统缓冲区,并且 UDP 不能保证按顺序发送/接收,所以我认为您发送数据的顺序方法是主要原因。

    【讨论】:

      【解决方案3】:

      UDP 不保证可靠传送。

      这与保证交付不可靠不同。

      试试你在不同大陆的同行,看看丢包/重新排序/重复是什么情况。 (我很好奇。)

      【讨论】:

        【解决方案4】:

        UDP 的问题是它通常工作得很好,与 TCP 相比它具有非常低的延迟。这可能是几乎所有 VoIP 应用程序、几乎所有在线游戏中的实时视频等(另见 RTP、RFC 3550)都使用它的原因。

        但是,有一个问题:-)

        UDP 不保证任何事情。因此,这意味着 UDP 客户端应用程序需要为许多可怕的事情做好准备,包括

        • 完全没有收到数据包
        • 数据包延迟
        • 数据包乱序
        • 数据包突发

        对于实时通信应用程序,已开发 RTP 以解决这些问题(请参阅 RTP)。除此之外 - 并获得对通信线路的更多控制, 还开发了 RTCP (RFC 3605)。

        但是,没有人会阻止您推出自己的协议,以确保在使用 UDP 作为传输层时一切正常。

        底线是,与使用有状态传输协议相比,使用 UDP 时,您必须在客户端智能上投入更多精力才能正确处理。

        【讨论】:

        • 在 VoIP 中使用它的原因是,在该域(和其他域)中,及时性比在 TCP 中保证每个数据包的顺序传递要重要得多。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-08
        • 1970-01-01
        相关资源
        最近更新 更多