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);
사용'AContext.Connection.IOHandler.Readln' : 서버 측에서, 다음 응답을 보내
TIdIOHandler.Write()
를 호출하기 전에 요청을 기다리는TIdIOHandler.ReadLn()
를 호출합니다. –