带有Indy 10的Delphi - TCP通信的最佳方法

时间:2015-07-30 08:52:54

标签: delphi tcp indy

我正在使用Delphi XE3和Indy 10(idTCPServer和idTCPClient)创建客户端 - 服务器应用程序。

服务器端将显示所有连接的客户端,我可以在列表中选择一些客户端并发送命令或流/文件。为此,我创建了一个消息队列,由Remy Lebeau先生吮吸。这就是我在做的事情:

enter image description here

我想知道的是:

  1. 这是我尝试做的好方法吗?

  2. 当一方开始读/写时,它希望另一方写/读?如果对方不能怎么办? Supose SERVER请求一个文件,但它不存在,CLIENT必须写一个"空的"无论如何都要避免出现问题?

  3. 顺便说一句,我找不到任何好的例子(Indy 10 TCP Communication),使用队列,错误处理等。在Indy的网站上有很多断开的链接。你能用一个很好的例子来吸引我一个网站吗?

    感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

  

当一方开始读/写时,它希望另一方写/读?如果对方不能怎么办? Supose SERVER请求一个文件,但它不存在,CLIENT必须写一个"空的"无论如何都要避免出现问题?

让客户端发送接受/拒绝请求的回复,然后才能传输文件。转发完成后,接收方也会发送回复,以便发送方知道接收方是否接收到整个文件。

Server: I will send a file
Client: OK
Server: FileStream
Client: OK

Server: Send me a file
Client: OK
Client: FileStream
Server: OK

Server: I will send a file
Client: Not Ready

Server: Send me a file
Client: Not Found

Server: Send me a file
Client: OK
Client: FileStream (error midway)
Server: FAILED

话虽如此,由于您的服务器是向客户端发送命令的服务器,因此请考虑在客户端使用TIdCmdTCPClient而不是TIdTCPClient。这将为您提供接收服务器命令的专用线程,您可以为命令创建OnCommand处理程序,并使用提供的TIdCommand对象发送回复。

考虑使用TIdTCPConnection.SendCmd()方法发送命令并阅读初始回复,并TIdTCPConnection.GetResponse()阅读最终回复。