2014-01-08 72 views
0

我有一個虛擬的測試服務器,使用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); 
+2

使用'AContext.Connection.IOHandler.Readln'等待客戶端發送一條線。 –

回答

0

您的客戶端使用TIdIOHandler.WriteLn()發送請求。在服務器端,調用TIdIOHandler.ReadLn()然後調用TIdIOHandler.Write()發送響應前等待請求:

procedure TDummySign.OnExecute(AContext: TIdContext); 
var 
    Req: string; 
begin 
    Req := AContext.Connection.IOHandler.ReadLn; 
    ... 
    AContext.Connection.IOHandler.Write(#6'01011234'#3#1'010101'#2'060100037908751531342CB30801010801000000000000D69A'#3); 
    ... 
end;