【发布时间】: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