TIdTCPServer OnExecute并阻止常量轮询

时间:2014-01-08 06:16:40

标签: delphi delphi-xe4 indy10

我有一个使用TIdTCPServer创建的虚拟测试服务器,我使用TIdTCPClient从客户端应用程序调用。 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设置为500毫秒。

我想要实现的是从我的客户端向该服务器发出多个请求,而不在请求之间重新建立连接。发生的事情是当我尝试从我的客户端读取此回复时(回复)不断增长,因为OnExecute在我发送第一个请求后一直持续执行。

有没有办法,一旦我“完成”这个OnExecute事件,告诉TidTCPServer再次等待,直到我通过我的客户端发送另一个请求?类似于在从客户端发送任何请求之前它的操作方式。我可能会调用TIdTCPServer某些属性的某些方法吗?我已经尝试通过Write调用并调用ClearWriteBuffer(它始终为nil所以不做任何事情),并且从客户端我清除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);

1 个答案:

答案 0 :(得分: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;