我正在使用TIdCmdTCPClient和TIdCmdTCPServer。突然间,我发现我可能想要双向交流。
什么才是最好的?我应该使用其他组件吗?如果是的话,哪一个?或者我应该让‘客户’投票‘服务器’来询问它是否希望交流什么?
这是一个很小的系统。两个客户端和十个服务器,每天一次,每30到60秒一次,每次一次,因此轮询的开销是无关紧要的。
如果有“正确”的方法,我就会更努力。
更新:这真的是一个非常简单的系统。交通非常少,一切都很简单。所有传输都是一个指示,甚至键入一个可选的单个参数。
<event type> [ <parameter>] (例如"HERE_IS_SOME_DATA 42" )
这可以在两个方向发送,在这里悬停并不是这样的“回复”。发个口信就好了(希望它能到那里)?接收没有数据的Ack?不捕获异常表示消息已成功发送?)
使用两个TIdCmdTCPServer是否可能(是否过分)?
发布于 2012-01-09 02:06:51
在连接生存期内,TIdCmdTCPClient和TIdCmdTCPServer都会不断轮询它们的套接字端点以获取入站数据。你不必为此做任何额外的事情。因此,一旦TIdCmdTCPClient连接到TIdCmdTCPServer,这两个组件最初都处于读取状态,直到其中一个组件向另一个组件发送命令为止。
现在,这样做有一个问题--只要任何一个组件发送第一个命令,接收组件就会将它解释为一个命令并发送回一个答复,而另一个组件将其解释为一个命令,并返回一个回复,这将被解释为一个命令,并返回一个回复等等,从而导致一个无休止的回复循环。因此,将TIdCmdTCPClient和TIdCmdTCPServer一起使用是不明智的。您应该在TIdCmdTCPServer中使用TIdTCPClient,或者在TIdTCPServer中使用TIdCmdTCPClient。取决于您的协议到底是什么样子,您可能不得不完全放弃使用TIdCmdTCPClient和TIdCmdTCPServer,只需在TIdTCPServer中使用TIdTCPClient,这样您就可以更好地控制两端的读写。如果不首先知道通信协议应该是什么样子,就很难用实际的代码来回答。
发布于 2012-01-08 11:31:44
一个TCP套接字连接可以在两个方向上使用。服务器可以随时异步向客户端发送数据。但是,由客户端来读取套接字,对于异步处理,这是在侦听器线程中完成的,侦听器线程从套接字读取,并将传入的数据操作与主工作线程同步。
Indy组件中的一个示例用例是Telnet组件(TIdTelnet),它有一个接收线程侦听服务器消息。
但是,您还询问了“正确”的方式--然后,答案取决于其他因素,如网络稳定性、有保证的交付以及如何处理临时服务器中断。在企业环境中,在许多用例中首选一个中央消息中心,因此所有各方都只连接到这个中心服务器,该服务器只负责可靠的消息传递,并保存消息直到收件人可用为止。
发布于 2012-04-17 20:51:05
您可以下载INDY 10 TCP server示例代码这里。
https://stackoverflow.com/questions/8777041
复制相似问题