Netty TCP客户端如何验证其消息是否已收到?

时间:2018-04-03 14:22:37

标签: java networking tcp netty

我正在使用Netty v4.1.5编写TCP客户端应用程序,并希望确保它知道下一跳是否已收到其消息。作为参考,我将“消息”定义为应用程序级消息,并且“' packet'作为TCP数据包。消息可以由一个或多个数据包组成。

我在这里遇到了一个关于堆栈溢出的非常类似的问题(TCP Netty Ensure message received),但多年前就被问过了,我不确定我是否同意答案。 TCP是一种可靠的网络协议,因此发送方可以确定给定的数据包是否已成功传送到其目的地。如果应用程序是同步的,它可以维护原始消息和它被分成的数据包之间的映射。地图可能如下所示:

消息1→(p1,p2,... pN)

消息2→(pN + 1,pN + 2,... pN + M)

使用此映射,发送应用程序可以推断在未传递数据包时未传递哪条消息。不幸的是,在异步世界中做出这种决定变得更加困难。应用程序的'send'方法不保证消息在返回时传递,因此数据包和消息之间的映射可能不存在。

尽管如此,即使您没有编写应用程序级协议,也无法知道哪个消息无法发送,并且无法更改标准以支持确认。如果发件人如上所述保持状态,则可以确定哪个消息无法自行发送。

Netty是否提供用于验证是否已收到消息的API?如果没有,Netty可以支持此功能吗?在我的情况下,知道哪个发送操作的执行失败就足够了(而不是被告知哪个消息失败)。也就是说,我会对允许我将发送失败/成功通知与特定发送呼叫联系起来的任何机制(例如,标识符)感到满意。

0 个答案:

没有答案