分布式客户端的可靠TCP传输

时间:2012-09-27 03:22:16

标签: java tcp activemq

我正在开发一个项目,我们在用户桌面上运行多个GUI客户端到一台服务器。客户端将在全球分发,并将通过WAN连接。

除了GUI本身的发布包之外,我想确保客户端PC上运行的应用程序没有依赖关系。传输本身应该是可靠的(没有丢弃的消息,重放未确认的消息)。

我想为我们的应用程序编写一个基于TCP套接字的自定义传输,并实现一些逻辑来检测丢弃或未确认的消息。

我也在考虑使用ActiveMQ(通过TCP / IP传输使用JMS)。还有其他替代方案或建议吗?

编辑:TCP是一种可靠的传输,但我需要检测并重放在客户端断开连接或重新启动时可能已丢弃的消息。

2 个答案:

答案 0 :(得分:1)

TCP保证在没有应用程序错误或崩溃的幸福世界中交付。

某些TCP数据可能会被网络堆栈确认,但在处理之前,应用程序可能已崩溃(或服务器崩溃)。

ActiveMQ与事务让你处理这些事情。甚至AMQ中的应用层确认也会让您可靠,系统复杂性也会增加(当然)。

答案 1 :(得分:0)

TCP [传输控制协议]已经处理了所有这些。

它保证您将获得所有数据,并且您将以正确的顺序获取数据,或者通知发件人某些数据无法发送。所有TCP数据包都包含它们在流中的位置,协议会为它收到的每个数据包发送一个确认。如果发送方未收到确认,则重新发送接收方可能没有的所有数据。只有在接收者获得应用层想要的数据(始终是流中的下一个字节)之后,它才会将数据提供给应用层。

如果TCP连接无法发送或接收数据(但不仅仅是因为它没有收到任何数据),TCP最终会放弃,并且您会在发送方获得I / O异常。如果接收方知道它应该接收数据(或者它有数据要发送,或者你启用了keep-alive),它也会放弃。您可以调整TCP协议放弃之前的时间量。默认值绰绰有余。

如果您想知道由于断开连接丢失了多少数据(但客户端很可能不会很快连接),您也可以在应用层上发送确认。如果您收到I / O异常(并且仅在获得异常时),请将最后确认的消息ID存储在数据库中,并在重新连接时恢复传输。

如果希望TCP重新发送丢失的数据包,请改用UDP。 UDP仅保证两件事:接收者接收的内容,发送者发送的内容,以及它从不尝试两次发送相同的数据包。