Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.06.2009, 19:26   #1
st01en
Пользователь
 
Регистрация: 06.02.2008
Сообщений: 33
По умолчанию TIdTCPClient.IOHandler.InputBufferI sEmpty не сразу обновляется

Задача: подключится к серверу и читать несколько строк ответа (читать и слать данные нужно будет и дальше, по ходу работы программы, но пока что не получается толком прочитать даже приветствие сервера).

Реализация:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    IdTCPClient1: TIdTCPClient;
    procedure Button1Click(Sender: TObject);
    procedure IdTCPClient1Connected(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    procedure GetData;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.GetData;
begin
  IdTCPClient1.IOHandler.CheckForDataOnSource; //без этого InputBufferIsEmpty будет возвращать true гораздо дольше
  while not IdTCPClient1.IOHandler.InputBufferIsEmpty do
    memo1.Lines.Add(IdTCPClient1.IOHandler.ReadLn);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  IdTCPClient1.Host := 'programmersforum.ru';
  IdTCPClient1.Port := 25;
  IdTCPClient1.Connect;
end;

procedure TForm1.IdTCPClient1Connected(Sender: TObject);
begin
  GetData;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  GetData;
end;

end.
Проблема: когда GetData вызывается из IdTCPClient1Connected, у свойства IdTCPClient1.IOHandler.InputBufferI sEmpty - значение true. Если буквально через пол секунды нажать на кнопку2 - значение уже false и код отрабатывает нормально.

помогайте плз
Спасибо!

p.s. SMTP сервер форума при соединении возвращает три строки, поэтому был выбран для примера.
st01en вне форума Ответить с цитированием
Старый 26.06.2009, 08:34   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Свойство Onconnected предназначено для анализа подключений и их логирования, это не лучшее место для работы с соединением.
Если кол-во строк не известно, то это реализуется таймером. Причины такого очень просты: что есть признак окончания привествия сервера ? задержка между первой строкой и второй может быть и пол секунды (а вот пакет потерялся). Поэтому проще организовывать двумя способами:
1. Делаете таймер, в котором проверяете наличие входящих данных и пишете их в какой- либо свой буфер, который и будет анализировать ваше приложение.
2. Необходимо признак окончания диалога (кол-во строк, некая подстрока, обозначающая что больше данных пока не будет). Не забывайте, что вы работаете в асинхронном режиме и любые попытки циклических проверок наличия данных будут приводить к ожиданию приложения окончания этого кода (пока time-out не выйдет).
3. Использовать TidTelnet с его событием ondataaviable.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Dr. Web 5.0 не обновляется... Smiley Безопасность, Шифрование 9 24.05.2009 15:11
Как? Окно с плеером поверх основого и не обновляется grisha-star JavaScript, Ajax 2 10.03.2009 15:47
Почему не обновляется курсор мыши? HunterMan Win Api 2 06.06.2008 01:39