我刚刚设法让客户端(IdTCPClient)根据需要向服务器(IdTCPServer)发送消息。但是,我如何让客户等待响应或适当地超时?
干杯, 阿德里安
答案 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。