Главная » Статьи » Программирование в Delphi

Служба с HTTP протоколом в Delphi
В связи с все здоровым вниманием, которое привлекает к себе Интернет, все больше людей становятся заинтересованы в сетевых технологиях. предоставленная статья отдана программированию на Borland Delphi с применением одного из самых славных Интернет-протоколов -HTTP. 

А именно, здесь мы анализируем компонент TNMHTTP (NetMasters HTTP), который можно выказать на вкладке
FastNet палитры компонентов Дельфи.

активизируем с построении . Если Вы уже знаете, словно такое HTTP и зачем он необходим , то вдерните следующий область .

Зачем нужен 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;

надлежащий пример - скачивание сразу нескольких URL одновременно. надобно заметить, будто многие программисты пренебрегают многозадачностью Windows (несущественно , как она реализована, обозрение сейчас не об данном ). В Дельфи очень легко создавать некоторые , подчиненные Вашей программе процессы (а точнее - потоки) с помощью базового класса TThread. да об данном мы поговорим в второй раз (в другой статье).

образец 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;

ПРИМЕЧАНИЕ: Чтобы завершить кое-который процесс (Thread), необходимо вызвать методику Terminate класса этого течения . Приостановить движение можно оператором Suspend, а продолжить выполнение - Resume. Также можно ополчить приоритет произвольного отдельного процесса через особенность
Priority.

порядочною пример занятия с течениями можно сыскать в подпапке Demos\Threads папки, куда-либо Вы определили
Delphi.

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

Если Вы коллекционируетесь создать скачивалку сайтов, то Вам нужно учитывать надлежащее (решить должно проблемы):

необходимо скачивать не только саму страничку в формате HTML, да и все входящие в нее узоры (gif, jpg, и т.д.);

в некоторых происшествиях удобно скачивать не одну страничку, а несколько страниц, высылки на которые находятся на первой из скачиваемых страничек. При этом необходимо учитывать, чисто на страничке могут откапываться и высылки на вторые сайты, почему необходимо анализировать скачиваемые высылки (чтобы невзначай не скачать весь Интернет). Для решения проблемы со скачиванием нескольких страничек нужно употреблять рекурсию;

нужно качественно оповещать пользователя о ходе закачки. Т.е. изображать общее и скачанное численность информации;

дальше скачивания надобно заменить Интернетовские ссылки на локальные, чтобы можно было просматривать странички в строю
offline.


Источник: http://www.yandex.ru
Категория: Программирование в Delphi | Добавил: Nikol05 (10.11.2010)
Просмотров: 2140 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]