В связи с все большим вниманием, которое привлекает к себе Интернет, все больше людей становятся заинтересованы в сетевых технологиях. Данная статья посвящена программированию на Borland Delphi с использованием одного из самых популярных Интернет-протоколов - HTTP.
А именно, здесь мы рассмотрим компонент TNMHTTP (NetMasters HTTP), который можно обнаружить на вкладке FastNet палитры компонентов Дельфи.
Начнем с теории. Если Вы уже знаете, что такое HTTP и зачем он нужен, то пропустите следующий раздел.
Итак, где же используется HTTP? Если Вы хотя бы чуть-чуть заглядывали на Интернет-странички и встречались с термином Web , то наверняка обратили внимание на то, что адреса страничек, как правило, начинаются с http:// . Протокол HTTP ( HyperText Transfer Protocol ) позволяет принимать и посылать не только гипертекстовые документы (типа html), но и любые другие (тексты (txt), изображения (gif, jpg), и т.д.). Ниже приведены типовые задачи, для выполнения которых необходимо использовать HTTP:
- Это лишь список некоторых из стандартных направлений программирования с использованием HTTP. Вы можете применять этот протокол для любых своих целей. Например, автоматические системы обновления данных, посылка запросов в Интернетовские базы, и еще множество всяческих других возможностей!
Ниже приведена таблица, содержащая наиболее краткое описание основных свойств, методов и событий компонента TNMHTTP:
| Свойства | Методы | События | ||
|
Body
- строка, содержащая либо путь к файлу, в который будет
записано тело http-документа (если св-во InputFileMode равно
True ), либо непосредственно само тело (если св-во InputFileMode
равно False ). Тип: string ; Далее некоторые свойства, унаследованные от TPowerSock: BytesRecvd
, BytesSent , BytesTotal
- количество отправленных, принятых и общее количество
байтов соотвественно. Тип: LongInt ; Еще есть множество свойств, но я пока остановлюсь на уже перечисленных. За дополнительной информацией обращайтесь к help-у по Дельфи. |
Get
(URL: string)
- посылает запрос на указанный URL. Данные после
выполнения этого запроса записываются в файлы или в сами свойства
Body и Header (в зависимости от значения свойства InputFileMode
); Далее некоторые методы, унаследованные от TPowerSock: Abort
и Cancel - прерывают соединение
и обмен данными; |
OnAuthenticationNeeded
- возникает, когда сервер требует указания имени пользователя
и пароля. В обработчике этого события (если оно возникнет) Вы должны ответить
серверу, запонив нужными значениями соответствующие переменные. Примечание:
Перед установлением соединения можно сразу заполнить поля UserID
и Password в свойстве HeaderInfo ; Далее некоторые методы, унаследованные от TPowerSock: OnConnect
- возникает, когда соединение с сервером успешно установлено;
|
Ну а теперь приступим к самому главному методу изучения - на примерах. Сразу замечу, что все приведенные здесь примеры можно скачать в полностью сделанных исходниках, щелкнув здесь .
И самый первый пример - программа, позволяющая определить, существует ли заданный URL:
{... Здесь идет заголовок файла и определение формы TForm1 и ее экземпляра Form1}
{ В форму нужно поместить кнопку TButton и одно поле TEdit. При нажатии на кнопку
вызывается обработчик события OnClick - Button1Click. Перед этим в TEdit нужно ввести
адрес URL.
НЕ ЗАБУДЬТЕ ПОМЕСТИТЬ В ФОРМУ КОМПОНЕНТ TNMHTTP! }
procedure Button1Click(Sender: TObject);
begin
{Пытаемя получить заголовок}
NMHTTP1.Head(Edit1.Text);
{Если URL неверный, то здесь выскочит ошибка}
end;
Далее - скачивание указанной
странички в указанный файл.
{... Здесь идет заголовок файла и определение формы 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;
Следующий пример - скачивание сразу нескольких URL одновременно. Надо заметить, что многие программисты пренебрегают многозадачностью Windows (неважно, как она реализована, речь сейчас не об этом). В Дельфи очень легко создавать отдельные, подчиненные Вашей программе процессы (а точнее - потоки) с помощью базового класса TThread . Но об этом мы поговорим в другой раз (в другой статье).
{... Здесь идет заголовок файла и определение формы 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.
Если Вы собираетесь создать скачивалку сайтов, то Вам необходимо учитывать следующее (решить следующие проблемы):