【发布时间】:2018-04-05 19:13:36
【问题描述】:
我在 Java 中使用 DatagramPacket 和 DatagramSocket 类通过 UDP 发送消息。我对网络的了解不完整。我知道:
当一个数据报被发送时,它实际上可能被分割成多个在网络上独立传播的数据(例如,如果我的数据报长度大于 MTU)。
UDP 不保证消息在接收时的顺序(并且根本不保证消息的接收)。
将这些信息放在一起,我“理解”如果我发送一个(大)DatagramPacket,我可能会以任何顺序接收我的数据报的字节(甚至可能丢失某些部分)!但我想我误解了一些东西,因为如果是这样的话,没有人会使用这样的协议。
如何确保我收到的数据报(如果我收到的话)与我发送的数据报相同?
【问题讨论】:
-
好问题。 UDP 用于流视频 (youtube) 或音乐之类的东西,这些东西并不重要。这是因为 UDP 不进行 3 次握手来确认数据到达那里,但正因为如此,UDP 更快。 TCP 则相反,它进行 3 次握手以确认数据到达那里。使用 UDP 通常如果数据包丢失,视频和音乐仍然可以播放(一些音频/视频延迟但仍然可以播放)。如果您想要一个示例,我创建了一个 TCP Web 服务器和一个 UDP 用于分配,请查看我的 Java 部分:katianie.com/blog/source-code
-
感谢您的回答。但因此,我的问题是:如何确保接收到的 DatagramPacket 等于发送的 DatagramPacket?例如,如果我只制作小的 DatagramsPackets(不超过 MTU),我是否可以保证它们在旅行中不会被拆分?如果我有这个保证,我将知道我收到的 DatagramPackets 是一致的,我将能够将数据利用到其中。
-
你需要做一些挖掘工作。您的问题的答案将来自对代码进行试验,将其与其他示例进行比较并阅读一些文档。