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