【问题标题】:TIdTCPServer OnExecute and prevent constant pollingTIdTCPServer OnExecute 并防止不断轮询
【发布时间】:2014-01-26 02:49:24
【问题描述】:

我有一个使用 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);

【问题讨论】:

  • 使用AContext.Connection.IOHandler.Readln等待客户端发送一行。

标签: delphi delphi-xe4 indy10


【解决方案1】:

您的客户正在使用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;

【讨论】:

    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多