-1

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

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

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

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

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

4

2 回答 2

1

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

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

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

于 2012-09-27T12:09:44.637 回答
0

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

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

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

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

如果您希望 TCP 重新发送丢失的数据包,请改用 UDP。UDP 只保证两件事:接收者收到什么,发送者确实发送了,并且它永远不会尝试发送相同的数据包两次。

于 2012-09-27T04:27:26.320 回答