Delphi Indy10: как IdTCPClient получает ответ от сервера, а длина ответа неизвестна - PullRequest
0 голосов
/ 02 сентября 2010

хост: 127.00.0.1; порт: 5001; ReadTimeout: 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;
//....

Когда по тайм-ауту часть других операций не будет оправдана. Есть идеи по созданию кода? Спасибо.

1 Ответ

2 голосов
/ 03 сентября 2010

ReadChar () вызовет исключение EIdReadTimeout, если истечет ReadTimeout. Вам нужно использовать блок try / Кроме того, чтобы поймать это, например:

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; 
//.... 
...