总是建议在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()
方法定期检查入站数据,以检测何时需要读取入站消息。