0

我用 UDP 在 Java 中实现了聊天。我有一个线程将数组列表的数据发送到另一个客户端,一个线程从另一个客户端接收数据。可以用方法填充数组列表。

为了发送消息,从数组列表中挑选出一个字节[],发送它的长度,然后发送字节。

现在我正在考虑丢包。我该如何解决这个问题?将消息发回将是非常低效的。如果接收方没有收到消息,我可以发回一条消息,因为我知道消息的长度,但为此我需要在两个客户端都有第二个套接字,因为接收方和发送方是两个线程。另一个问题是当具有数据长度的数据包丢失并且读取的数据包是长度时会发生什么。

有人可以帮我如何实现吗?

(TCP 不是解决方案,因为我喜欢做 UDP 打孔)

4

2 回答 2

0

有一个简单且经过良好测试的协议称为 TCP。因为 TCP 和 UDP 之间唯一(相关)的区别是 TCP 具有对数据包丢失(和类似的)的校正,而 UDP 没有。

这就是为什么只有在丢包与应用程序无关的情况下才应该使用 UDP。

于 2013-11-09T12:47:31.243 回答
0

您也许应该使用序列号。如果生成了新消息,请将其与序列号一起发送。如果另一个对等点检测到丢失的序列号,它应该尝试从另一个对等点请求丢失的消息。当然,您还应该能够通过限制重试和使用适当的超时来处理序列号不再可用或不断失败的情况。此外,其他对等方可以用“序列号不可用”来回答。

本质上,这类似于 TCP 为您所做的。因此,了解 TCP 如何处理可靠的数据包传输将帮助您找到适合您的用例的解决方案。

简化后,TCP 通过将数据包保存在缓冲区中来解决此问题:如果其他对等方确认接收,则从缓冲区中删除数据包。如果检测到丢失的数据包,其他对等方可以请求重新发送缓冲区。为了检测到这一点,接收器还使用了一个缓冲区。如果缓冲区已满,则暂停数据包传输。这就是为什么您需要更大的缓冲区来保持长延迟高速链路(如卫星链路)的管道满载并以最大吞吐量利用链路。由于这不是您所需要的,并且由于您只处理单个消息,因此您可以简化它:您的缓冲区是完整的聊天历史记录,序列计数器保持同步,您不需要吞吐量,只需要可靠的传输。

于 2017-05-08T23:19:57.900 回答