Поиск по блогу

вторник, 31 марта 2009 г.

Компоненты Internet Direct (Indy). Вводная статья для новичков

Если в двух словах, 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-запросов. Об этом с примерами в следующий раз.

Чтобы быть в курсе обновлений блога, можно подписаться на RSS.

Статьи схожей тематики:



6 комментариев:

  1. Маша, Indy полный отстой. Когда кодил несколько сетевых утилиток, намучался с этем инди. Простая функция get вызывала исключение "Значение '' не является числом" (вольно), погуглил, оказывается не у меня одного, настройки ничего не меняют. Чтобы Indy заработал с SSL это вообще нужно с огромным бубном попрыгать, а работа SSL+Socks5 вообще не возможна, баг в компоненте, который до сих пор не исправлен. Свойство прокси с поддержкой FTP прокси есть, но оно не работает, это мелким шрифтом написано в документации, непонятно зачем тогда оно там есть. Много ошибок при обработке чанкет страниц и сжатия. Короче тогда я плюнул и написал всё на чистом WinSock2. А сейчас на WinSock писать слишком объемно, поэтому нашел замену - ICS компоненты. Правда там нет КукаМенеджера, сейчас прикручиваю от Indy (ибо аналогов просто нет). При этом безглючный КукаМенеджер есть только в самой последней версии инди, в других он со множеством багов. Вот так.

    ОтветитьУдалить
  2. Sbseo, спасибо за развернутый комментарий. Насчет багов Indy я в курсе :) Но считаю, что начинать работать с интернетом проще всего именно через эти компоненты. А статья рассчитана именно на начинающих.

    За ICS спасибо, поищу информацию и ознакомлюсь на досуге :)

    ОтветитьУдалить
  3. Маша, я же говорю, что мне не удалось скомпилить ни одного приложения. Вернее они компилятся но не работают. Дома у меня последняя версия Инди, там не работает функция Get, поэтому твой пример кода никак не поможет например мне при изучении Инди, а вот на работе стоит Delphi 7 со стандартным инди, там Get работает, но на работе стоит прокси с Ntlm авторизацией, вот с ней инди не работает :) Поэтому новичам конечно оно может и поможет, если у них компонент будет работать. Ну а со своей стороны я бы предложил новичкам начать работать с библиотекой WinInet (это врапер WinSock для интернет эксплорера). Если освоят ее, то дальше сами смогут определить, какой компонент (библиотека) им более удобна, т.к. в WinInet нет множества очень нужных функций. А библиотека в скобочках, потому, что многие используют библиотеку Синапсис, она в виде отдельной DLL, но функций там столько же, сколько и в Indy, и всё более качественно. Насчет кукаМенеджера кстати не знаю, есть он там или нет. Надо посмотреть...

    Это всего лишь моя точка зрения и она может не совпадать с вашей, я ничего никому не навязываю. Удачи.

    ОтветитьУдалить
  4. >А сейчас на WinSock писать слишком объемно, поэтому нашел замену - ICS компоненты. Правда там нет КукаМенеджера, сейчас прикручиваю от Indy (ибо аналогов просто нет).
    Повеселил, "специалист".
    Прикручивать куки менеджер от другой либы - не извращение ли?
    Самому обработать событие OnCookie религия не позволяет или отсутствие знаний?

    ОтветитьУдалить
  5. Текущая версия Indy работает на ура! Get и Post + SSL, все заработало с полпинка! Остается только радоваться))
    Только единственное, что было не понятно, почему пришлось к ssl отдельно скачивать библиотеки. Компоненты есть, а библ. не включили))

    ОтветитьУдалить
  6. А в uses что прописать? У меня Delphi XE3.

    ОтветитьУдалить

Комментарии модерируются, вопросы не по теме удаляются, троллинг тоже.

К сожалению, у меня нет столько свободного времени, чтобы отвечать на все частные вопросы, так что, может, свой вопрос лучше задать на каком-нибудь форуме?

Поделиться