【问题标题】:Delphi Indy10: How IdTCPClient gets the response of Server,and the length of response is unknownDelphi Indy10:IdTCPClient如何获取Server的响应,响应的长度未知
【发布时间】:2010-09-02 07:32:08
【问题描述】:
主机:127.00.0.1;
端口:5001;
读取超时:3000;
//Following codes to get the response
procedure TForm1.Button2Click(Sender: TObject);
var
s:string;
begin
try
while True do
begin
s := s+IdTCPClient1.IOHandler.ReadChar();
end;
finally
showmessage(s);
....other operations...
end;
//....
当timerout时,其他操作的部分将不会被执行。有什么想法可以继续代码吗?谢谢。
【问题讨论】:
标签:
delphi
delphi-2010
indy10
【解决方案1】:
ReadChar() 如果 ReadTimeout 过去,将引发EIdReadTimeout 异常。您需要使用 try/except 块来捕获它,例如:
procedure TForm1.Button2Click(Sender: TObject);
var
s: string;
begin
try
repeat
try
s := s + IdTCPClient1.IOHandler.ReadChar();
except
on E: EIdReadTimeout do Break;
end;
until False;
finally
ShowMessage(s);
...
end;
//....
更好的选择是根本不在循环中调用 ReadChar()。请改用 IOHandler 的 CheckForDataOnSource() 和 InputBufferAsString() 方法,例如:
procedure TForm1.Button2Click(Sender: TObject);
var
s: string;
begin
try
while IdTCPClient1.IOHandler.CheckForDataOnSource(IdTimeoutDefault) do begin end;
finally
s := IdTCPClient1.IOHandler.InputBufferAsString;
ShowMessage(s);
...
end;
//....