Работаем 3484 день              Каталог программиста. Сайты Статьи Исходники Программы Скрипты Новости
Карта сайтаКарта сайта Форум DELPHI Basic Аsm Базы WebMaster Windows Железо Программы Культура Игры
Все разделы каталогаКаталог Новости C++# PHP FoxPro Безопасн. JavaScript Linux КПК Моб Документы Юмор Хостинг
RSS канал "Каталог программиста" канал Компьютерная жизньКЖизнь WinApi Java Сети Форматы Программеру Иные_ОС Каталоги Алгоритмы Форумы Разные
 
Архив сайта за 2001-2007 годыАрхив—> Архив сайта за 2001-2007 годы DELPHIDelphi Архив сайта за 2001-2007 годы C++#C++# Архив сайта за 2001-2007 годы PHPPHP Архив сайта за 2001-2007 годы СетиСети Архив сайта за 2001-2007 годы БазыБазы Архив сайта за 2001-2007 годы WebMasterWebMaster Архив сайта за 2001-2007 годы WindowsWindows Архив сайта за 2001-2007 годы ЖелезоЖелезо Архив сайта за 2001-2007 годы АлгоритмыАлгоритмы Архив сайта за 2001-2007 годы ЮморЮмор Архив сайта за 2001-2007 годы РазныеРазные
Поиск по сайтуПоиск по сайту: 
Сайт Google
В каталоге: 
В архиве: 
Новые ссылки
  • PHP скрипт скачивания файлов по временным ссылкам (7) Временные ссылки на php. Что это такое и с чем их едят? Все очень просто. Часто при построении каког
  • Анекдоты от 29.07.2010 (28) Кофе на работе - это напиток, который пьют, когда хотят есть.
  • Програмная эмуляция нажатия клавиш (29) Процедура для Delphi на ASM
  • Диагностика сети и мониторинг в Windows 7 (36) В помощь пользователям, столкнувшимся с проблемами работы сети, Microsoft еще в Windows Vista включи
  • Перетаскивание объектов (33) Свойства DragMode, DragCursor, методы BeginDrag, OnDragOver, OnDragDrop, OnEndDrag, OnStartDrag, пар
  • Как программно нажать на кнопку мыши? (57) Пример на Delphi
  • Cкрипт статистики поисковых запросов (50) В данной статье представлен PHP скрипт на базе которого легко можно будет создать модуль статистки п
  • Анекдоты от 22.07.2010 (174) Мальчик, которого на пасеке укусила коза, перестал верить в логику.
  • Настройка Windows 7: классическое меню Программы в стиле XP (135) Некоторые пользователи Windows 7 не довольны новым меню "Пуск" и хотели бы вернуться к его
  • В чём секрет защищённости Internet Explorer 8 (101) Браузер Internet Explorer в течение долгого времени имел дурную славу одного из самых уязвимых. С вы
  • 10 статей архива:
  • Как скопировать содержимое одного RichEdit в другой.
    (3286)
  • Сжатие данных на PHP
    (4582)
  • Советские анекдоты #2
    (1648)
  • Просмотр буфера обмена
    (4085)
  • На работе хорошо
    (2727)
  • detect if a USB device is connected or disconnected?
    (5674)
  • Восстановление реестра. Практическое руководство
    (4842)
  • Лабораторная работа: MySQL
    (3854)
  • Как работать с буфером обмена (Clipboard)
    (2950)
  • Функции для парсинга строк
    (2346)
  • Рейтинг@Mail.ru Истинное количество посещений сайта сегодня

    Каталог программиста » Delphi/Pascal » Интернет, сети

    Использование HTTP в Delphi

    (18.09.2008) (1593) (67)
    Данная статья посвящена программированию на Borland Delphi с использованием одного из самых популярных Интернет-протоколов - HTTP. Рассмотрим компонент TNMHTTP (NetMasters HTTP), который можно обнаружить на вкладке FastNet палитры компонентов Дельфи.

    Зачем нужен HTTP

    Итак, где же используется HTTP? Если Вы хотя бы чуть-чуть заглядывали на Интернет-странички и встречались с термином Web, то наверняка обратили внимание на то, что адреса страничек, как правило, начинаются с http://. Протокол HTTP (HyperText Transfer Protocol) позволяет принимать и посылать не только гипертекстовые документы (типа html), но и любые другие (тексты (txt), изображения (gif, jpg), и т.д.). Ниже приведены типовые задачи, для выполнения которых необходимо использовать HTTP:
      · Браузеры - программы, позволяющие просматривать Интернет-странички;  
      · Скачивальщики - программы, позволяющие скачивать из Интернета странички, рисунки и другие документы;  
      · Чаты - программы, позволяющие общаться по сети. Часто документы HTTP используются для хранения сообщений (как, например, в конференциях).  
         
    - Это лишь список некоторых из стандартных направлений программирования с использованием HTTP. Вы можете применять этот протокол для любых своих целей. Например, автоматические системы обновления данных, посылка запросов в Интернетовские базы, и еще множество всяческих других возможностей!

     

    Краткое описание свойств, методов и событий

    Ниже приведена таблица, содержащая наиболее краткое описание основных свойств, методов и событий компонента TNMHTTP:

    Свойства
    Body - строка, содержащая либо путь к файлу, в который будет записано тело http-документа (если св-во InputFileMode равно True), либо непосредственно само тело (если св-во InputFileMode равно False). Тип: string;
    Header - строка, содержащая либо путь к файлу, в который будет записан заголовок http-документа (если св-во InputFileMode равно True), либо непосредственно сам заголовок (если св-во InputFileMode равно False). Тип: string;
    HeaderInfo - структура, содержащая различную информацию о http-документе (подробней см. в help-файле). Тип: THeaderInfo;
    InputFileMode - тип записи результата. Значение True - запись в файлы, указанные в свойствах Body и Header, False - запись в сами эти свойства. Тип: Boolean;
    OutputFileMode - тип отсылаемых данных (методами Put, Post и Trace). Значение True - данные для отправки содержатся в файлах, указанных при вызове этих методов, а False - в самих аргументах этих методов. Тип: Boolean;
    Далее некоторые свойства, унаследованные от TPowerSock:
    BytesRecvd, BytesSent, BytesTotal - количество отправленных, принятых и общее количество байтов соотвественно. Тип: LongInt;
    Connected - показывает, установленно ли в данный момент соединение. Тип: Boolean;
    BeenCanceled - показывает, было ли прервано соединение с сервером. Тип: Boolean;
    Host - строка, содержащая хост-имя удаленного компьютера. Заполнять не надо, так как это свойство устанавливается автоматически при вызове методов Get, Put, Post и т.д. Тип: string. Port - Integer, содержащий порт удаленного компьютера (заполняется тоже автоматически);
    TimeOut - таймаут в миллисекундах. Тип: Integer;
    Еще есть множество свойств, но я пока остановлюсь на уже перечисленных. За дополнительной информацией обращайтесь к help-у по Дельфи.


    Методы
    Get(URL: string) - посылает запрос на указанный URL. Данные после выполнения этого запроса записываются в файлы или в сами свойства Body и Header (в зависимости от значения свойства InputFileMode);
    Head(URL: string) - посылает запрос на указанный URL. Данные после выполнения этого запроса записываются в файл или в само свойство Header (в зависимости от значения свойства InputFileMode). В отличие от метода Get, при вызове Head запрос отсылается только на заголовок http-документа;
    Post(URL, PostData: string) - посылает запрос на изменение http-документа (с адресом URL) на данные, содержащиеся в параметре PostData. Если OutputFileMode равен True, то в PostData должен содержаться путь к файлу, содержащему нужные данные.
    Put(URL, PutData: string) - посылает запрос на создание http-документа (с адресом URL), содержащего данные, переданные в параметре PutData. Если OutputFileMode равен True, то в PostData должен содержаться путь к файлу, содержащему нужные данные.
    Trace(URL, TraceData: string) - посылает запрос на получение отладочных данных (для отладки соединения с HTTP-сервером). Данные для запроса нужно указать в параметре TraceData. Если OutputFileMode равен True, то в TraceData должен содержаться путь к файлу, содержащему нужные данные.
    Delete(URL: string) - посылает запрос на удаление http-документа (с адресом URL).
    Далее некоторые методы, унаследованные от TPowerSock:
    Abort и Cancel - прерывают соединение и обмен данными;
    Disconnect - отсоединение от HTTP-сервера;

    События
    OnAuthenticationNeeded - возникает, когда сервер требует указания имени пользователя и пароля. В обработчике этого события (если оно возникнет) Вы должны ответить серверу, запонив нужными значениями соответствующие переменные. Примечание: Перед установлением соединения можно сразу заполнить поля UserID и Password в свойстве HeaderInfo;
    OnAboutToSend - возникает, когда компонент TNMHTTP собирается отправлять данные (запрос). В обработчике этого события можно заполнить дополнительной информацией свойство SendHeader;
    OnFailure - возникает, когда текущая операция завершилась неудачно, т.е. произошла ошибка;
    OnRedirect - возникает, сервер переадресовал ссылку с указанной URL на другую ссылку. Установив параметр handled в значение True можно запретить переадресацию и остановиться на запрошенной URL. Значение по умолчанию - False;
    OnSuccess - возникает, когда текущая операция завершилась успешно, т.е. запрос был выполнен без ошибок;
    Далее некоторые методы, унаследованные от TPowerSock:
    OnConnect - возникает, когда соединение с сервером успешно установлено;
    OnDisconnect - возникает, когда соединение с сервером завершено;
    OnConnectionFailed - возникает, когда соединение с сервером установить не удалось;
    OnError - возникает, когда последняя операция была завершена с ошибкой;
    OnHostResolved - возникает, когда от DNS получен IP-адрес указанного хоста;
    OnInvalidHost - возникает, когда DNS вернул ошибку при попытке определить IP-адрес указанного хоста;
    OnPacketRecvd - возникает, когда значения свойств BytesRecvd и BytesTotal изменены, т.е. была принята новая порция данных от сервера;
    OnPacketSent - возникает, когда значения свойств BytesSent и BytesTotal изменены, т.е. была отправлена новая порция данных на сервер;
    OnStatus - возникает, когда статус компонента был изменен (для обновления визуального оповещения пользователя);

     

    Практика и примеры

    Ну а теперь приступим к самому главному методу изучения - на примерах. 
    И самый первый пример - программа, позволяющая определить, существует ли заданный URL:

    Пример 1. Проверка существования указанной URL   

    {... Здесь идет заголовок файла и определение формы TForm1 и ее экземпляра Form1}

    {В форму нужно поместить кнопку TButton и одно поле TEdit. 
    При нажатии на кнопку вызывается обработчик события OnClick - Button1Click. Перед этим в TEdit нужно ввести адрес URL.
    НЕ ЗАБУДЬТЕ ПОМЕСТИТЬ В ФОРМУ КОМПОНЕНТ TNMHTTP!}

    procedure
     Button1Click(Sender: TObject);
    begin

      {Пытаемя получить заголовок}

      NMHTTP1.Head(Edit1.Text);
      {Если URL неверный, то здесь выскочит ошибка}

    end
    ;

    Пример 2. Скачивание указанной URL в заданный файл

    {... Здесь идет заголовок файла и определение формы TForm1 и ее экземпляра Form1}

    {В форму нужно поместить кнопку TButton и три поля TEdit. 
    При нажатии на кнопку вызывается обработчик события OnClick - Button1Click. Перед этим в первый TEdit нужно ввести адрес URL, во второй - имя файла для заголовка, а в третий - имя файла для тела странички (html).
    НЕ ЗАБУДЬТЕ ПОМЕСТИТЬ В ФОРМУ КОМПОНЕНТ TNMHTTP!}

    procedure
     Button1Click(Sender: TObject);
    begin

      {Пытаемся получить http-документ}

      {Результат надо записать в файлы}

      NMHTTP1.InputFileMode := True;
      {А здесь указываем в какие именно файлы}

      NMHTTP1.Header := Edit2.Text;
      NMHTTP1.Body := Edit3.Text;
      NMHTTP1.Get(Edit1.Text);
    end
    ;

    Пример 3. Одновременное скачивание указанных URL в заданный каталог

    {... Здесь идет заголовок файла и определение формы TForm1 и ее экземпляра Form1}

    {Описание класса отдельного процесса}

    type

      THTTPThread = class
    (TThread)
      private

         {Для каждого процесса - создаем свой компонент TNMHTTP}

        FHTTP: TNMHTTP;
      protected

    {Execute вызывается при запуске процесса; override - заменяем существующую процедуру базового класса TThread}

        procedure
     Execute; override;
    {DoWork - созданная нами функция, выполнение которой синхронизируется в Execute}

        procedure
     DoWork;
      public

    {URL - созданная нами строка, указывающая процессу, какой URL ему нужно скачать}

        URL: string
    ;
      end
    ;

    {В форму нужно поместить три кнопки TButton, одно поле TEdit и один список TListBox. 
    При нажатии на кнопку Button1 вызывается обработчик события OnClick - Button1Click. Перед этим в TEdit нужно ввести путь к каталогу, 
    в котором будут храниться скачанные файлы, а ListBox1 нужно заполнить списком URL-ов для скачивания (с помощью кнопок Add (Button2) и Delete (Button3)).}

    procedure
     TForm1.Button3Click(Sender: TObject);
    begin

      {Удаление выделенного URL из списка}

      if
     ListBox1.ItemIndex >= 0 then
        ListBox1.Items.Delete(ListBox1.ItemIndex);
    end
    ;

    procedure
     TForm1.Button2Click(Sender: TObject);
      var
     s: string;
    begin

      {Добавление URL в список}

      s := InputBox('Добавить'
    ,'Введите URL:','');
      if
     s <> '' then
        ListBox1.Items.Add(s);
    end
    ;

    procedure
     TForm1.Button1Click(Sender: TObject);
      var
     i: Integer;
    begin

      {Проверка на существование каталога}

      if
     Length(Edit1.Text) > 0 then
        if
     not DirectoryExists(Edit1.Text) then
          MkDir(Edit1.Text);
      {Далее идет создание для каждого URL в списке своего процесса}

      for
     i := 0 to ListBox1.Items.Count-1 do begin
        with
     THTTPThread.Create(True) do begin
          {Создаем приостановленную задачу, указываем ей ее URL и запускаем ее}

          URL := ListBox1.Items[i];
          Resume;
        end
    ;
      end
    ;
    end
    ;

      {Операторы процесса THTTPThread}


    procedure
     THTTPThread.Execute;
    begin

      {Делаем так, чтобы каждый процесс выполнялся одновременно с другими (синхронизация)}

      Synchronize(DoWork);
    end
    ;

    procedure
     THTTPThread.DoWork;
      var
     i: Integer;
    begin

      {Создаем компонент TNMHTTP}

      FHTTP := TNMHTTP.Create(Form1);
      {Результат надо записывать в файлы}

      FHTTP.InputFileMode := True;
      {Подбираем имена для файлов}

      i := 1
    ;
      while
     FileExists(Form1.Edit1.Text+'\page'+IntToStr(i)+'.htm'do
        Inc(i);
      {Указываем, в какие именно файлы класть результат}

      FHTTP.Body := Form1.Edit1.Text+'\body'
    +IntToStr(i)+'.htm';
      FHTTP.Header := Form1.Edit1.Text+'\header'
    +IntToStr(i)+'.txt';
      {Пытаемся послать запрос}

      FHTTP.Get(URL);
      {Перед завершением процесса не забываем освободить память из-под компонента}

      FHTTP.Free;
    end
    ;

     

    Замечания по алгоритмам типовых задач

    Если Вы собираетесь создать скачивалку сайтов, то Вам необходимо учитывать следующее (решить следующие проблемы):
      · Нужно скачивать не только саму страничку в формате HTML, но и все входящие в нее рисунки (gif, jpg, и т.д.);  
      · в некоторых случаях удобно скачивать не одну страничку, а несколько страниц, ссылки на которые находятся на первой из скачиваемых страничек. При этом нужно учитывать, что на страничке могут находиться и ссылки на другие сайты, поэтому необходимо анализировать скачиваемые ссылки (чтобы случайно не скачать весь Интернет). Для решения задачи со скачиванием нескольких страничек нужно использовать рекурсию;  
      · необходимо качественно информировать пользователя о ходе закачки. Т.е. показывать общее и скачанное количество информации;  
      · после скачивания нужно заменить Интернетовские ссылки на локальные, чтобы можно было просматривать странички в режиме offline.  
      ·  
         

     

    Эпилог

    В этой статье отображены основные приемы работы с компонентом TNMHTTP в Дельфи. Если у Вас есть вопросы - скидывайте их мне на E-mail: snick@mailru.com
    , а еще лучше - пишите в конференции этого сайта (Delphi. Общие вопросы), чтобы и другие пользователи смогли увидеть Ваш вопрос и попытаться на него ответить!
    Замечу, что TNMHTTP - не единственный компонент, релизующий доступ по протоколу HTTP. Есть и его аналоги с более расширенными возможностями, например, набор компонентов ICS (Internet Component Suite), в состав которого входит даже компонент FTPServer, позволяющий легко запрограммировать свой собственный сервер FTP для Windows. Этот набор можно скачать на сайте Delphi Super Page
    .
    Карих Николай. Московская область, г.Жуковский

    Перейти на сайтПерейти на сайт автора  Другие статьи раздела "Delphi/Pascal » Интернет, сети"

    Предыдущая страница  Разделы и Новости  Карта сайта  Архив
    Подписка на новости сайтаНовости на Email:
    Subscribe.Ru
    Rss2Email.ru
    Читать в Яндекс.Ленте FeedBurner

    Напишите свои замечанияКомментарии
    (Комментировать могут только пользователи, зарегистрированные на форуме. Вопросы пишите в форумах)
    Пока нет комментариев
    * Имя:   * Пароль:
    * Текст сообщения не более 350 символов
    Авторы сайта не несут ответственности за комментарии посетителей.
    Комментарии, не соответствующие принятым нормам закона, морали и тематике сайта удаляются.
    Powered by Scriptsmill Comments Script

  • Сообщить о неверной ссылке - Нажав на эту кнопку, вы сообщите нам о неработающей ссылке.
  • Если Вы обнаружили вредоносную программу, скрипт, сайт или если Вы хотите изменить текст, адрес или удалить ссылку, добавить статью сообщите нам об этом в форуме, указав ее название и URL
  • Цифры после названия в скобках - дата обновления в каталоге и количество просмотров
  • Статья в архиве сайта Статья находится в разделе "Архив"
  • Публикация ссылок осуществлятся посетителями сайта. Авторы сайта не несут ответственности за содержание информации, размещаемой на сайте, неправильное указание адреса, искажение информации или авторства, а также за информацию на сайтах, указанных в каталоге, последствия перехода по ссылке, запуска скаченных скриптов или программ и т.п.
  • При любом использовании материалов, ссылка на сайт автора и наш сайт обязательна
  • Подписка на новостиНовости на Email
    Subscribe.Ru
    Rss2Email.ru
    Читать в Яндекс.Ленте
    FeedBurner
    Форум:
    DELPHI
    C/C++
    WEB
    Алгоритмы
    Прочие
    Новости сайта
    О публикациях
    Windows
    Программы
    Флейм
    Темы форумов:
  • kristart Помогите выбрать свободную ОС в форуме Windows Jul 29 2010, 14:44:07
  • FYAN Нужен программист в форуме Прочие Jul 28 2010, 07:36:26
  • gleb_sitnikov Предлагаю руководство в форуме Предложения по публикации в каталоге и комментарии. Jul 9 2010, 17:13:10
  • piter Очень нужен программист в форуме DELPHI Jul 1 2010, 16:13:02
  • piter БД - 3 нормальная форма. в форуме Прочие Jun 28 2010, 09:42:55
  • abee Join в Foxpro9. в форуме Прочие Jun 28 2010, 09:40:37
  • gleb_sitnikov Предлагаю статью в форуме Предложения по публикации в каталоге и комментарии. Jun 21 2010, 11:16:01
  • piter определение даты в форуме DELPHI Jun 7 2010, 16:01:27
  • gleb_sitnikov Предлагаю учебник в форуме Предложения по публикации в каталоге и комментарии. Jun 7 2010, 12:13:31
  • gogo пожалуйста, напишите программу в Visual C++ в форуме C++ Builder Jun 7 2010, 11:06:51
  • Новые комменты к
  • Process Explorer Бесплатная, компактная, программа для мониторинга в режиме реального времени сис...
  • RbControls Pack Компоненты анимируются при перемещении и нажатии мышки. Эти компоненты позволяют...
  • Библиотека BASS библиотека содержит большое количество примеров, в том числе и на дельфи, позвол...
  • Протокол TCP/IP или как работает Интернет (для чайников) В основе работы глобальной сети Интернет лежит набор (стек) протоколов TCP/IP. ...

  • Карта сайта   Каталог  Архив сайта за 2001-2007 годыАрхив  Форум  Блог  Начало страницы  Добавить в избранное  Предыдущая страница
    Поиск  Поиск по сайту Google Сайт Google
      
    Поиск по сайту Яндекс
    0.18с
    Каталог программиста Блог "Компьютеры и жизнь" Top 100 Borland Sites. Vote for us