簡體   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