Если в двух словах, Indy — компоненты для удобной
работы с популярными интернет-протоколами. Принцип их работы основывается на
использовании сокетов в блокирующем режиме. Indy интересен и удобен тем, что
достаточно сильно абстрагирован. И программирование в Indy сводится к линейному
программированию. Кстати, в интернете широко распространена переводная статья, в
которой есть слова "блокирующий режим не является дьяволом" :)) В свое время
меня очень позабавил этот перевод. Статья — часть книги Хувера и Харири "Глубины
Indy". В принципе, для работы с Indy вам вовсе не обязательно всю ее читать, но
ознакомиться с принципами работы протоколов интернета я все-таки рекомендую. Что
касается "дьявольского" режима. Вызов блокирующего сокета действительно не
возвращает управления, пока не выполнит свою задачу. Когда вызовы делаются в
главном потоке, интерфейс приложения может "подвиснуть". Чтобы позволить
избежать этой неприятной ситуации, разработчики индей создали компонент
TIdAntiFreeze. Достаточно просто кинуть его на форму — и пользовательский
интерфейс будет преспокойно перерисовываться во время выполнения блокирующих
вызовов.
Вы наверняка уже ознакомились с содержимым различных закладок "Indy (...)" в
Delphi. Компонентов там немало, и каждый из них может быть полезным. Я сама
работала далеко не со всеми, так как не вижу надобности их изучать без
определенной задачи.
В базовый дистрибутив Delphi входят Indy v.9 с копейками. Наверное, желательно
сразу сделать обновление до более новой версии (например, у меня сейчас 10.0.76,
но есть и более поздние, вроде).
Есть клиентские и серверные компоненты для работы с одними и теми же
протоколами. Indy реально упрощают разработку приложений, в отличие от варианта
разработки того же самого функционала на сокетах. Например, чтобы установить
связь с сервером, вы должны просто-напросто вызвать метод Connect. Успешное
установление соединения ознаменуется возвратом из метода без возникновения
эксепшена. Если же соединение неызовется установится — вызовется исключение.
"Академический" пример (код не рабочий, не запускайте :) ):
with IndyClient do
begin
Host := 'test.com';
Port := 2000;
Connect;
Try
// работа с данными (чтение, запись...)
finally
Disconnect;
end;
end;
Host и port могут быть установлены в инспекторе объектов
или в рантайме.
Для чего же можно использовать компоненты Indy в задачах парсинга? Применение
разнообразно! Самое простое — получение содержимого страницы (с этим уже все,
наверное, сталкивались) с использованием компонента IdHTTP:
var
rcvrdata: TMemoryStream;
idHttp1: TidHttp;
begin
idHttp1 := TidHttp.Create(nil);
rcvrdata := TMemoryStream.Create;
idHttp1.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)';
idHttp1.Request.AcceptLanguage := 'ru';
idHttp1.Response.KeepAlive := true;
idHttp1.HandleRedirects := true;
try
idHttp1.Get(Edit1.Text, rcvrdata);
finally
idHttp1.Free;
end;
if rcvrdata.Size > 0 then begin
ShowMessage('Получено ' + inttostr(rcvrdata.Size));
rcvrdata.SaveToFile('c:\111.tmp');
end;
rcvrdata.Free;
end;
Как видно, можно не только получить содержимое страницы, но
и имитировать загрузку документа с определенного клиента. Компоненты Indy вообще
удобны для формирования заголовков и POST-запросов. Об этом с примерами в
следующий раз.
|