Indy 10中的双向TCP通信?

时间:2012-01-08 11:17:26

标签: delphi tcp indy10

我正在使用TIdCmdTCPClient和TIdCmdTCPServer。突然间,我发现我可能希望进行双向沟通。

什么是最好的?我应该使用其他一些组件吗?如果是这样,哪个?或者我应该使用'客户'轮询'服务器'来询问是否希望与其进行通信?

这是一个非常小的系统。两个客户端和十个服务器,每天30到60秒发生一次喷射,每天一次,几分钟,因此轮询的开销是无关紧要的。

如果有'正确'的方式,我只是喜欢。


更新:这真是一个非常简单的系统。交通非常少,而且一切都很简单。所有传输都是偶数类型的指示,是可选的单个参数。

<event type> [ <parameter>]例如"HERE_IS_SOME_DATA 42"

这可以在两个方向发送,悬停在这里不是“回复”。只是发消息(并希望它到达那里)?收到没有数据的Ack?未捕获异常表示消息已成功发送?)

使用两个TIdCmdTCPServer是否可能(是否有点矫枉过正?)

3 个答案:

答案 0 :(得分:6)

TIdCmdTCPClientTIdCmdTCPServer在连接的生命周期内连续轮询其套接字端点以获取入站数据。你不必为此做额外的事情。因此,只要TIdCmdTCPClient连接到TIdCmdTCPServer,两个组件最初都将处于读取状态,直到其中一个组件向另一个发送命令。

现在,执行此操作时出现问题 - 只要任一组件发送第一个命令,接收组件就会将其解释为命令并发回回复,其他组件将其解释为命令并发回回复,将被解释为命令并发回回复,等等,导致无休止的回复循环。因此,将TIdCmdTCPClientTIdCmdTCPServer放在一起是不明智的。您应该将TIdTCPClientTIdCmdTCPServer一起使用,或将TIdCmdTCPClientTIdTCPServer一起使用。根据您的协议的具体情况,您可能不得不放弃使用TIdCmdTCPClientTIdCmdTCPServer,只需将TIdTCPClientTIdTCPServer一起使用,这样您就可以更好地控制阅读和写作在两端。在没有首先知道通信协议应该是什么样子的情况下,很难用实际代码回答。

答案 1 :(得分:4)

单个TCP套接字连接可以在两个方向上使用。服务器可以随时异步发送数据到客户端。然而,由客户端来读取套接字,对于异步处理,这是在侦听器线程中完成的,该线程从套接字读取并将传入的数据操作与主工作线程同步。

Indy组件中的一个示例用例是Telnet客户端组件(TIdTelnet),它具有侦听服务器消息的接收线程。

但您也询问了“正确”的方式 - 然后答案取决于其他因素,如网络稳定性,保证交付以及如何处理临时服务器中断。在企业环境中,在许多用例中首选一个中央消息传递中心,以便所有各方仅连接到此中央服务器,该服务器仅负责可靠的消息传递,并在收件人可用之前保留消息。

答案 2 :(得分:1)

您可以下载INDY 10 TCP server演示示例代码here