我用UDP实现了Java聊天。我有一个线程将数组列表的数据发送到另一个客户端,一个线程从另一个客户端接收数据。可以使用方法填充数组列表。
要发送消息,从数组列表中挑出一个byte [],发送其长度,然后发送字节。
现在我正在考虑数据包丢失。我该如何实现修复?发送消息将是非常无效的。我可以发回消息,如果接收者没有收到消息,因为我知道消息的长度,但为此我需要在两个客户端的第二个套接字导致接收者和发送者是两个线程。另一个问题是当数据长度丢失且数据包读取的数据包长度时会发生什么。
有人可以帮我解决这个问题吗?
(TCP无法解决,因为我喜欢做UDP打孔)
答案 0 :(得分:0)
有一种简单且经过良好测试的协议称为TCP。因为TCP和UDP之间唯一(相关)的区别是TCP已经纠正了丢包(和类似),而UDP没有。
这就是为什么如果数据包丢失与应用程序无关,UDP应该仅。
答案 1 :(得分:0)
您应该使用序列号。如果生成了新消息,请将其与序列号一起发送。如果另一个对等体检测到丢失的序列号,它应该尝试从另一个对等体请求丢失的消息。当然,您还应该能够通过限制重试和使用适当的超时来处理序列号不再可用或不断失败的情况。另外,另一个同伴可以回答“序列号不可用”。
基本上,这类似于TCP为您所做的事情。因此,查看TCP如何处理可靠的数据包传输将帮助您找到适合您的用例的解决方案。
简化,TCP通过将数据包保存在缓冲区中来解决此问题:如果另一个对等方确认接收,则从缓冲区中删除数据包。如果检测到丢失的数据包,则另一个对等体可以请求重新发送缓冲区。为了检测这一点,接收器也使用缓冲器。如果缓冲区已满,则暂停数据包传输。这就是为什么你需要更大的缓冲区来保持长延迟高速链路(如卫星链路)的流水线充满,并在最大吞吐量时利用链路。由于这不是您所需要的,并且由于您只处理单个消息,因此您可以简化:您的缓冲区是完整的聊天历史记录,序列计数器保持同步,您不需要吞吐量,只需要可靠的传输。