我正在使用TIdCmdTCPClient和TIdCmdTCPServer。突然间,我发现我可能希望进行双向沟通。
什么是最好的?我应该使用其他一些组件吗?如果是这样,哪个?或者我应该使用'客户'轮询'服务器'来询问是否希望与其进行通信?
这是一个非常小的系统。两个客户端和十个服务器,每天30到60秒发生一次喷射,每天一次,几分钟,因此轮询的开销是无关紧要的。
如果有'正确'的方式,我只是喜欢。
更新:这真是一个非常简单的系统。交通非常少,而且一切都很简单。所有传输都是偶数类型的指示,是可选的单个参数。
<event type> [ <parameter>]
例如"HERE_IS_SOME_DATA 42"
这可以在两个方向发送,悬停在这里不是“回复”。只是发消息(并希望它到达那里)?收到没有数据的Ack?未捕获异常表示消息已成功发送?)
使用两个TIdCmdTCPServer是否可能(是否有点矫枉过正?)
答案 0 :(得分:6)
TIdCmdTCPClient
和TIdCmdTCPServer
在连接的生命周期内连续轮询其套接字端点以获取入站数据。你不必为此做额外的事情。因此,只要TIdCmdTCPClient
连接到TIdCmdTCPServer
,两个组件最初都将处于读取状态,直到其中一个组件向另一个发送命令。
现在,执行此操作时出现问题 - 只要任一组件发送第一个命令,接收组件就会将其解释为命令并发回回复,其他组件将其解释为命令并发回回复,将被解释为命令并发回回复,等等,导致无休止的回复循环。因此,将TIdCmdTCPClient
和TIdCmdTCPServer
放在一起是不明智的。您应该将TIdTCPClient
与TIdCmdTCPServer
一起使用,或将TIdCmdTCPClient
与TIdTCPServer
一起使用。根据您的协议的具体情况,您可能不得不放弃使用TIdCmdTCPClient
和TIdCmdTCPServer
,只需将TIdTCPClient
与TIdTCPServer
一起使用,这样您就可以更好地控制阅读和写作在两端。在没有首先知道通信协议应该是什么样子的情况下,很难用实际代码回答。
答案 1 :(得分:4)
单个TCP套接字连接可以在两个方向上使用。服务器可以随时异步发送数据到客户端。然而,由客户端来读取套接字,对于异步处理,这是在侦听器线程中完成的,该线程从套接字读取并将传入的数据操作与主工作线程同步。
Indy组件中的一个示例用例是Telnet客户端组件(TIdTelnet),它具有侦听服务器消息的接收线程。
但您也询问了“正确”的方式 - 然后答案取决于其他因素,如网络稳定性,保证交付以及如何处理临时服务器中断。在企业环境中,在许多用例中首选一个中央消息传递中心,以便所有各方仅连接到此中央服务器,该服务器仅负责可靠的消息传递,并在收件人可用之前保留消息。
答案 2 :(得分:1)
您可以下载INDY 10 TCP server
演示示例代码here。