2014-01-08 5 views
0

TIdTCPClient를 사용하여 클라이언트 응용 프로그램에서 호출하는 TIdTCPServer를 사용하여 더미 테스트 서버를 만들었습니다. 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' : 서버 측에서, 다음 응답을 보내 TIdIOHandler.Write()를 호출하기 전에 요청을 기다리는 TIdIOHandler.ReadLn()를 호출합니다. –

답변

0

당신의 클라이언트가 요청을 보낼 TIdIOHandler.WriteLn()을 사용하고 있습니다 :

는 참고로, 여기에 요청을 보낼 내 클라이언트 코드입니다. 선을 보내도록 클라이언트를 기다리는

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;