gpt4 book ai didi

delphi - 与 TIdTCPServer 同时发送和接收

转载 作者:行者123 更新时间:2023-12-03 08:56:25 25 4
gpt4 key购买 nike

始终建议在 OnExecute 中执行所有发送/接收任务TIdTCPServer 的事件处理程序,但我不明白以下内容:

如何等待输入的特定序列并同时将一些数据发送到同一个客户端?我不需要命令响应序列,但我需要:

  • 不断发送实时数据
  • 在接收编辑后的数据时返回
  • 并接收命令并为它们提供响应。

  • 例如,如果我们正在等待 CR-LF:
    procedure TSocketServer._serverExecute(AContext: TIdContext);
    var
    msg: string;
    begin
    msg := AContext.Connection.IOHandler.ReadLn();
    //Here we are only if CRLF was detected.
    //How to send while we are waiting?
    _log(msg);
    end;

    最佳答案

    重要的是,当使用同一连接发送未经请求的数据和响应数据时,不要重叠传出消息,否则您将破坏您的协议(protocol)。最好只让 1 个线程完成所有发送,以便在发送另一条消息之前完整发送一条消息。只需确保您设计的协议(protocol)允许在客户端发送命令之后和收到响应之前发送未经请求的数据。每条消息都应该描述它是什么类型的消息,这样客户端可以检测到响应并将其与较早的命令匹配,同时按原样处理未经请求的数据。

    有几种不同的方式可以处理发送:

  • 使用单独的线程进行读取和发送。例如,有 OnExecute线程处理所有读取,并使用另一个工作线程处理所有发送。如果 OnExecute接收需要发送响应的入站命令,将响应数据传递给发送线程(以线程安全的方式),以便它可以在安全的情况下在未经请求的消息之间发送响应。
  • OnExecute线程处理读取和发送。根据需要持续发送外发未经请求的数据,并使用 IOHandler.InputBufferIsEmpty() 定期检查入站数据和 IOHandler.CheckForSourceOnData()检测何时需要读取入站消息的方法。
  • 否则,就像 Jerry Dodge 在评论中建议的那样,只需使用单独的连接,一个用于命令响应数据,一个用于未经请求的数据。
  • 关于delphi - 与 TIdTCPServer 同时发送和接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55653997/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com