繁体   English   中英

与TIdTCPServer同时发送和接收

[英]Send and receive simultaneously with TIdTCPServer

它始终是建议执行所有发送/接收中的任务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;

重要的是,当使用同一连接发送未经请求的数据和响应数据时,请勿重叠传出的消息,否则会破坏协议。 最好只有一个线程来完成所有发送,以便在发送另一条消息之前,先完整发送一条消息。 只要确保您设计了协议,就可以在客户端发送命令之后到收到响应之前发送未经请求的数据。 每个消息都应描述消息的类型,以便客户端可以检测到响应并将其与更早的命令进行匹配,同时按原样处理未经请求的数据。

您可以通过几种不同的方式来处理发送:

  • 使用单独的线程进行读取和发送。 例如,让OnExecute线程处理所有读取,并使用另一个工作线程处理所有发送。 如果OnExecute接收到需要发送响应的入站命令,则将响应数据(以线程安全的方式)传递给发送线程,以便在安全的情况下可以在未经请求的消息之间发送响应。

  • OnExecute线程处理读取和发送。 根据需要连续发送未经请求的传出数据,并使用IOHandler.InputBufferIsEmpty()IOHandler.CheckForSourceOnData()方法定期检查入站数据,以检测何时需要读取入站消息。

  • 否则,就像杰里·道奇(Jerry Dodge)在评论中建议的那样,只需使用单独的连接,一个用于命令响应数据,另一个用于非请求数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM