Delphi Indy10: как IdTCPClient получает ответ сервера, а длина ответа неизвестна

хост: 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;
//....

При тайм-ауте часть других операций не будет выполняться. Есть идеи по продолжению кода? Спасибо.


person Jeason    schedule 02.09.2010    source источник


Ответы (1)


ReadChar() вызовет исключение EIdReadTimeout, если ReadTimeout истечет. Вам нужно использовать блок 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() в цикле. Вместо этого используйте методы CheckForDataOnSource() и InputBufferAsString() IOHandler, например:

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; 
//.... 
person Remy Lebeau    schedule 02.09.2010