[英]Send and Receive Stream with TidTCPClient and TidTCPServer in Delphi XE2
[英]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.