Delphi(Indy)客户端发送服务器请求,如何等待响应?

时间:2012-07-20 05:32:46

标签: delphi client wait indy

我刚刚设法让客户端(IdTCPClient)根据需要向服务器(IdTCPServer)发送消息。但是,我如何让客户等待响应或适当地超时?

干杯, 阿德里安

3 个答案:

答案 0 :(得分:3)

客户端可以使用IOHandler.Readxxx方法读取响应,其中大多数允许设置超时。也可以直接在IdTCPClient.IOHandler上指定读取超时。

procedure TForm1.ReadTimerElapsed(Sender: TObject);
var
  S: String;
begin
  ... 
  // connect
  IdTCPClient1.Connect;

  // send data
  ...

  // use one of the Read methods to read the response.
  // some methods have a timeout parameter, 
  // and others set a timeout flag 

  S := IdTCPClient1.IOHandler.ReadLn(...);

  if IdTCPClient1.IOHandler.ReadLnTimedOut then
    ...
  else
    ...


end;

另请参阅:How can I wait for a string from a server with IdTCPClient?

答案 1 :(得分:1)

例如:

客户端:

procedure TForm1.SendCmdButtonClick(Sender: TObject);
var
  Resp: String;
begin
  Client.IOHandler.WriteLn('CMD');
  Resp := Client.IOHandler.ReadLn;
end;

服务器:

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  Cmd: String;
begin
  Cmd := AContext.Connection.IOHandler.ReadLn;
  ...
  AContext.Connection.IOHandler.WriteLn(...);
end;

或者,您可以改为使用TIdTCPConnection.SendCmd()方法:

客户端:

procedure TForm1.SendCmdButtonClick(Sender: TObject);
begin
  // any non-200 reply will raise an EIdReplyRFCError exception
  Client.SendCmd('CMD', 200);
  // Client.LastCmdResult.Text will contain the response text
end;

服务器:

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  Cmd: String;
begin
  Cmd := AContext.Connection.IOHandler.ReadLn;
  ...
  if (Command is Successful) then
    AContext.Connection.IOHandler.WriteLn('200 ' + ...);
  else
    AContext.Connection.IOHandler.WriteLn('500 Some Error Text here');
end;

在后一种情况下,如果切换到TIdCmdTCPServer,则可以使用TIdCmdTCPServer.CommandHandlers集合在设计时定义命令,并为每个命令分配每个命令OnCommand事件处理程序而不是使用OnExecute事件手动读取和解析命令,例如:

// OnCommand event handler for 'CMD' TIdCommandHandler object...
procedure TForm1.IdCmdTCPServer1CMDCommand(ASender: TIdCommand);
begin
  ...
  if (Command is Successful) then
    ASender.Reply.SetReply(200, ...);
  else
    ASender.Reply.SetReply(500, 'Some Error Text here');
end;

答案 2 :(得分:0)

我已经使用了Indy组件(或Delphi),但我相信TIdTCPClient不会异步运行,所以没有可以设置的OnData或类似事件。

您需要从父类(TIdTCPConnection)调用其中一个读取方法,例如ReadLn(...)。或者,您可以查看使用TIdTCPClient后代的众多Indy组件之一。

可以找到该课程的文档here