Java UDP编程

Java UDP编程,java,network-programming,udp,Java,Network Programming,Udp,这是我第一次尝试UDP套接字编程。在不涉及程序细节的情况下,服务器基本上会向客户机发送n条设置大小的消息。我已经编写并运行了代码,看起来我所有的消息都是按照服务器发送的顺序发送到客户端的。这有什么意义吗?我的理解是,使用UDP发送的数据包并不总是以相同的顺序发送。如果是这样的话,那么为什么客户端程序以相同的顺序接收所有服务器消息,并且从不丢失任何消息?我尝试过不同的消息编号(例如发送200或500条消息)和不同的消息大小。我没有使用线程或类似的东西。只需设置一个循环,让服务器一个接一个地发送数据

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

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

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

UDP不保证可靠传递

这与保证交货不可靠不同


尝试不同大陆的同行,看看数据包丢失/重新排序/重复是什么样子的。(我很好奇。)

UDP的问题是,它通常工作得非常好,与TCP相比,它的延迟非常低。这可能就是为什么它被用于几乎所有的VoIP应用程序中,用于实时视频等(也可参见RTP、RFC 3550),用于几乎所有的在线游戏等

然而,有一个陷阱:-)

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

  • 根本没有收到数据包
  • 数据包延迟
  • 包坏了
  • 数据包突发
对于实时通信应用,已经开发了RTP来处理这些问题(参见RTP)。除此之外,为了更好地控制通信线路, 还开发了RTCP(RFC 3605)

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


底线是,当使用UDP时,为了使事情正常进行,您必须在客户端智能上付出比使用有状态传输协议更多的努力。

仅仅因为您可能丢失数据包并不意味着您就可以这样做。尝试以最快的速度发送几百万个数据包,并测量是否丢失。不过,重排序通常发生在路由器上,尤其是在对数据包进行负载平衡的情况下。在VoIP中使用重排序的原因是,在该域(以及其他域)中,时间性比TCP中保证的每个数据包的顺序交付要重要得多。