Indy 10中的双向TCP通信?

Maw*_*awg 1 delphi tcp indy10

我正在使用TIdCmdTCPClient和TIdCmdTCPServer.突然间,我发现我可能想要进行双向沟通.

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

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

如果有一个'正确'的方式,我只是喜欢.


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

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

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

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

Rem*_*eau 6

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

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

  • 您的更新未提供足够的信息来回答您的问题.您的活动是否需要将回复发送给发件人?如果没有,那么在你的`OnCommand`事件处理程序中将`TIdCommand.PerformReply`属性设置为'False`可能是你的问题的解决方案,所以你可以继续一起使用`TIdCmdTCPClient`和`TIdCmdTCPServer`.如果您更详细地阐述您的协议并展示典型双向会话的示例,那将非常有用. (2认同)
  • ACK将是一个回复.这会使事情变得非常复杂.可行,但需要更多的工作. (2认同)
  • 当数据发送到套接字而不引发异常时,它只意味着数据已成功传递到内核的内部缓冲区,以便以后通过线路传输.没有接收器发送某种类型的ACK,就无法知道该缓冲区是否实际发送和接收.根据您的描述,我将切换到`TIdTCPClient`和`TIdTCPServer`来控制入站数据包的读取,然后在手动将任何其他内容传递给`TIdCommandHandlers.HandleCommand()之前处理并丢弃ACK.然后,您的`OnCommand`事件处理程序可以发送ACK. (2认同)