【问题标题】:Indy10 TCP client deliver reply to sending procedureIndy10 TCP 客户端对发送过程进行回复
【发布时间】:2016-12-19 10:07:42
【问题描述】:

我正在使用 Indy 10 在 Delphi 7 中制作客户端程序。

它必须使用 TIdTCPClient 连接到服务器并保持连接以发送和获取命令和回复,直到程序关闭。

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

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

我看到了 2 个解决方案:

  1. 从一个过程发出请求并在另一个过程中处理它 - 代码和逻辑会更复杂。

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

【问题讨论】:

    标签: delphi client-server delphi-7 indy indy10


    【解决方案1】:

    由于涉及阅读线程,它确实使事情复杂了一点。读取线程必须是接收所有回复的线程,然后它可以根据需要将它们分派给处理程序。

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

    正如您所提到的,您的第二个解决方案不是一个很好的解决方案。

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

    【讨论】:

    • 非常感谢您的回复!不幸的是,我的经验不允许我实施这个解决方案(
    猜你喜欢
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 2012-09-06
    • 2011-12-02
    • 2011-08-15
    相关资源
    最近更新 更多