1

我正在使用 TIdCmdTCPClient 和 TIdCmdTCPServer。突然间我发现我可能喜欢双向交流。

什么是最好的?我应该使用其他一些组件吗?如果是这样,是哪个?还是我应该拼凑让“客户端”轮询“服务器”以询问它是否希望交流任何内容?

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

如果有一个“正确”的方式,我只是想知道。


更新:这确实是一个非常简单的系统。流量很少,一切都很简单。所有的传输都是一个可选的单个参数类型的指示。

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

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

使用两个 TIdCmdTCPServer 是否可能(是否会过大)?

4

3 回答 3

6

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

现在,这样做有一个问题——只要任何一个组件发送第一个命令,接收组件就会将其解释为命令并发送回一个回复,另一个组件会将其解释为一个命令并发回一个回复,这将被解释为一个命令并发送回一个回复,依此类推,从而导致来回无休止的回复循环。因此,将TIdCmdTCPClientandTIdCmdTCPServer一起使用是不明智的。您应该使用TIdTCPClientwithTIdCmdTCPServer或使用TIdCmdTCPClientwith TIdTCPServer。根据您的协议的具体外观,您可能不得不完全放弃使用TIdCmdTCPClientandTIdCmdTCPServer并只使用TIdTCPClientwithTIdTCPServer因此您可以更好地控制两端的读写。如果不首先知道通信协议应该是什么样子,就很难用实际代码来回答。

于 2012-01-09T02:06:51.627 回答
4

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

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

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

于 2012-01-08T11:31:44.177 回答
1

您可以在此处INDY 10 TCP server下载演示示例代码。

于 2012-04-17T20:51:05.300 回答