繁体   English   中英

Indy 10中的双向TCP通信?

[英]Two-way TCP communication in Indy 10?

我正在使用TIdCmdTCPClient和TIdCmdTCPServer。 突然间,我发现我想进行双向通信。

什么是最好的? 我是否应该使用其他组件? 如果是这样? 还是我应该笨拙地让“客户”对“服务器”进行调查,以询问是否希望进行任何通信?

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

如果有一种“正确”的方法,我只是混蛋。


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

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

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

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

在连接有效期内, TIdCmdTCPClientTIdCmdTCPServer连续轮询其套接字端点以获取入站数据。 您不必为此额外做任何事情。 因此,一旦TIdCmdTCPClient连接到TIdCmdTCPServer ,两个组件将首先处于读取状态,直到其中一个组件向TIdCmdTCPServer组件发送命令为止。

现在,这样做有一个问题-任何一个组件发送第一个命令,接收组件都会将其解释为命令并发送回一个答复,另一个组件会将其解释为命令并发送回一个答复,它将被解释为命令并发回答复,依此类推,导致无休止的来回答复循环。 因此,同时使用TIdCmdTCPClientTIdCmdTCPServer是不明智的。 您应该将TIdTCPClientTIdCmdTCPServer使用,或者将TIdCmdTCPClientTIdTCPServer TIdCmdTCPClient使用。 根据您的协议的确切外观,可能必须完全放弃使用TIdCmdTCPClientTIdCmdTCPServer而仅将TIdTCPClientTIdTCPServer一起使用,这样您就可以更好地控制两端的读写。 在不首先知道通信协议是什么样的情况下,很难用实际的代码来回答。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM