我有一個虛擬的測試服務器,使用TIdTCPServer創建,我使用TIdTCPClient從客戶端應用程序調用。 TIdTCPServer的OnExecute方法是:TIdTCPServer OnExecute並防止不斷輪詢
procedure TDummySign.OnExecute(AContext: TIdContext);
begin
Sleep(FDelay);
// <1>010101<2>060100037908751531342CB30801010801000000000000D69A<3>
AContext.Connection.IOHandler.Write(#6'01011234'#3#1'010101'#2'060100037908751531342CB30801010801000000000000D69A'#3);
end;
FDelay設置爲500ms。
我想要實現的是從客戶端向服務器發出多個請求,而無需在請求之間重新建立連接。發生什麼事情是,當我試圖從我的客戶端讀取這個回覆時,它(回覆)不斷增長,因爲一旦我發送了我的第一個請求,OnExecute就會不斷執行。
有沒有辦法,一旦我用這個OnExecute事件「完成」,告訴TidTCPServer再次等待,直到我通過來自我的客戶端的另一個請求發送?與在客戶端發送任何請求之前的操作方式類似。 TIdTCPServer的一些屬性我可能會調用一些方法?我試着通過Write調試並調用ClearWriteBuffer(它總是零,所以什麼也不做),並且從客戶端清除InputBuffer但無濟於事。
供參考,這是我的客戶端代碼發送請求:
FIdTCPClient.IOHandler.Writeln(AString);
FIdTCPClient.IOHandler.InputBuffer.Clear;
TotalTime := 0;
TimedOut := False;
Reply := '';
Result := nil;
ParseInput := CreatePacketParserInput(ProtocolType);
repeat
if FIdTCPClient.IOHandler.CheckForDataOnSource(Interval) then
begin
Reply := Reply + FIdTCPClient.IOHandler.InputBufferAsString;
ParseInput.Reply := Reply;
FParser.ParseReply(ParseInput, Result, SignId);
CanContinue := (Result.ParseReplyResponse = TCommsParseReplyResponse.rrOK) or
(Result.ParseReplyResponse = TCommsParseReplyResponse.rrStartSessionRetry) or
(Result.ParseReplyResponse = TCommsParseReplyResponse.rrPacketParseError);
end
else
begin
TotalTime := TotalTime + Interval;
if TotalTime > FCommsConfig.ReadTimeOut then
TimedOut := True;
end;
until TimedOut or (CanContinue);
使用'AContext.Connection.IOHandler.Readln'等待客戶端發送一條線。 –