Delphi Indy10 TCP客户端向发送过程发送回复

Delphi Indy10 TCP客户端向发送过程发送回复,delphi,client-server,delphi-7,indy,indy10,Delphi,Client Server,Delphi 7,Indy,Indy10,我正在用Delphi 7和Indy 10制作一个客户端程序 它必须使用TIdTCPClient连接到服务器,并在程序关闭之前保持用于发送和获取命令和回复的连接 服务器只能为每个客户端保持一个恒定连接以发送信息消息。 TIdTCPClient正在通过读取线程进行侦听 问题: 例如,我从某个过程向服务器发送一个请求(使用WriteLn)以获取字符串列表。我怎样才能在相同的过程中得到该请求的答案(回复),而不留下它?比如使用TIdHTTP 我看到两种解决方案: 从一个过程发出请求并在另一个过程中处理-

我正在用Delphi 7和Indy 10制作一个客户端程序

它必须使用TIdTCPClient连接到服务器,并在程序关闭之前保持用于发送和获取命令和回复的连接

服务器只能为每个客户端保持一个恒定连接以发送信息消息。 TIdTCPClient正在通过读取线程进行侦听

问题:
例如,我从某个过程向服务器发送一个请求(使用WriteLn)以获取字符串列表。我怎样才能在相同的过程中得到该请求的答案(回复),而不留下它?比如使用TIdHTTP

我看到两种解决方案:

  • 从一个过程发出请求并在另一个过程中处理-代码和逻辑将更加复杂

  • 对于过程中的每个请求,创建一个新的TIdTCPClient(Connect、WriteLn、ReadLn、Disconnect、Free)并处理请求。但是我不喜欢这个解决方案,因为它会导致很大的开销


  • 由于涉及到阅读线程,因此会使事情稍微复杂一些。阅读线程需要是接收所有回复的线程,然后它可以根据需要将它们分派给处理程序

    如果您不介意分解代码,那么您的第一个解决方案很好。这是最简单的解决方案,如果主线程是发出请求的线程,那么这是最好的解决方案。永远不要阻塞主线程

    正如你提到的,你的第二个解决方案不是很好


    另一个解决方案是为每个请求创建一个
    TEvent
    ,并将每个请求放入某个列表/队列中。当收到响应时,让读取线程查找并发出相应事件的信号。然后,发送过程可以等待事件发出信号(例如,
    TThread.Synchronize()
    就是这样工作的)。如果过程在主线程中运行,请使用来执行等待,这样在等待时您仍然可以为主消息队列提供服务。

    由于涉及到读取线程,因此会使事情稍微复杂一些。阅读线程需要是接收所有回复的线程,然后它可以根据需要将它们分派给处理程序

    如果您不介意分解代码,那么您的第一个解决方案很好。这是最简单的解决方案,如果主线程是发出请求的线程,那么这是最好的解决方案。永远不要阻塞主线程

    正如你提到的,你的第二个解决方案不是很好


    另一个解决方案是为每个请求创建一个
    TEvent
    ,并将每个请求放入某个列表/队列中。当收到响应时,让读取线程查找并发出相应事件的信号。然后,发送过程可以等待事件发出信号(例如,
    TThread.Synchronize()
    就是这样工作的)。如果该过程在主线程中运行,请使用进行等待,这样您在等待时仍可以为主消息队列提供服务。

    非常感谢您的回复!不幸的是,我的经验不允许我实施此解决方案(非常感谢您的回复!不幸的是,我的经验不允许我实施此解决方案)(