Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Для работы с серверами Internet

ПРИКЛАДНОЙ УРОВЕНЬ

ЗАНЯТИЕ № 16

ПРОГРАММИРОВАНИЕ КЛИЕНТСКИХ ПРИЛОЖЕНИЙ

ДЛЯ РАБОТЫ С СЕРВЕРАМИ INTERNET

Цель работы: практически освоить приемы работы с функциями библиотеки WinInet при программировании клиентских приложений для работы с серверами Internet.

 

1. ТЕОРЕТИЧЕСКОЕ ВВЕДЕНИЕ

 

В теоретическом введении рассматриваются следующие вопросы.

• Библиотека WinInet.

• Функции библиотеки WinInet.

 

1.1. Библиотека WinInet

 

Библиотека WinInet содержит набор процедур и функций для создания клиентских служб internet - HTTP, FTP и Gopher.

Создание клиентского приложения для работы с Web-сервером проводится следующим образом.

1) Открытие сеанса святи (функция IntetnetOpen).

2) Установление соединения по URE (функция InternetOpenUrl).

3) Чтение html-файла (функция InternetReadFile).

4) Закрытие соединения (функция InternetCloseHandle).

Создание клиентского приложения для работы с FTP-сервером проводится следующим образом.

1) Открытие сеанса связи (функция IntetnetOpen).

2) Установление соединения с FTP-сервером (функция IntetnetConnect).

3) Работа с FTP -сервером (функции FtpFindFirstFile и FtpFindNextFile - для вывода на экран списка файлов в текущем каталоге FTP -сервера FtpGetCurrentDirectory для вывода на экран имени текущего каталог FtpGetFile - для чтения файлов, расположенных на FTP -сервере и т. д.).

4) Закрытие соединения (функция InternetCloseHandle).

 

1.2. Функции библиотеки WININET

 

1.2.1. Функция создания сеанса связи InternetOpen

 

function InternetOpen(

lpszAgent: PChar;

dwAccessType: DWORD;

IpszProxy, IpszProxyBypass: PChar;

dwFlags: DWORD): HINTERNET: stdcall;

где lpszAgenl - адрес строки, которая содержит имя приложения. Если установить значение nil, то используется имя текущего приложения;

dwAccessType - определяет тип доступа. Возможные значения перечислены в табл. 1;

Таблица 1

Тип доступа к FTP-серверу

 

Значение Описание
INTERNET OPEN ТУРЕ DIRECT Разрешены любые имена
INTERNET OPEN ТУРЕ PRECONFIG Преобразование peгистра

 

IpszProxyName - адрес строки, которая содержит имя proxy-сервера. Устанавливается в nil;

IpszProxyBypass - список опций proxy-сервера. Устанавливается в nil;

dwFlags - флаги. Возможны следующие значения: INTERNET_FLAG_ASYNC,INTERNET_FLAG_FROM_CACHE: INTERNET_FLAG_OFFLINE.

Функция при успешном выполнении возвращает дескриптор. В случае ошибки возвращает nil.

 

1.2.2. Функция установления URL-соединения InternetOpenUrl

 

function lnlernetOpenUrl(

hinet: HINTERNET;

IpszUrl: PChar;

Ipszl leaders: PChar;

dwHeadersLeugth: DWORD:

dwFlags: DWORD;

dwContext: DWORD): HINTERNET; stdcall;,

где hInternet - дескриптор, возвращаемый функцией InternetOpen;

IpszUrl – адрес URL;

IpszHeaders - адрес строки, которая содержит заголовок, посылаемый HTTP -серверу;

dwFIeadersLengih - длина заголовка, если заголовок не указал как nil;

dwFlags- флаги;

dwContext - устанавливается в 0.

Возвращаемое значение: при успешном выполнении возвращает деск­риптор. В случае ошибки возвращает nil.

 

1.2.3. Функция чтения файла, находящегося на WEB-cepвepe InternetReadFile

 

function IniernetReadFile(

hFile: HINTERNET; IpBuffer: Pointer;

dwNumberOfBytesToRead: DWORD;

varlpdvvNumberOfBytesRead: DWORD): BOOL; stdcall;

где hFile - дескриптор, полученный после выполнения функции InternetOpenUrl, FtpOpenFile или HttpOpenRequest;

IpBuffer - адрес буфера, куда записываются получаемые клиентом данные

dwNumberOfBytesToRead - размер буфера;

lpdwNumberOfBytesRead - количество полученных байт. Возвращаемое значение - TRUE при успешном выполнении или FALSE в случае ошибки.

 

1.2.4. Функция закрытия дескриптора – InternetCloscHandle

 

function InlernelCloseHandle(hInet: HINTERNET): BOOL; stdcall;,

где hInternet - дескриптор объекта Internet.

Функция возвращает TRUE при успешном выполнении или FALSE в случае ошибки.

 

1.2.5. Функция установления соединения InternetConnect

 

function InternetConnect(

hInet: HINTERNET;

IpszServerName: PChar;

nServerPort: INTERNET PORT;

IpszUsername: PChar;

IpszPassword: PChar;

dwService: DWORD;

dwFlags: DWORD;

dwContext: DWORD): HINTERNET; stdcall;

где hInternet - дескриптор, полученный при выполнении функции Internet Open;

IpszServerName - адрес строки, заканчивающейся нулем. Строка содержит имя хоста сервера Internet;

nServerPort - порт сервера. Можно указать или конкретное число, или одну из констант, приведенных в табл. 2;

IpszUsername - адрес строки, заканчивающейся нулем, содержащей имя пользователя;

IpszPassword - адрес строки, заканчивающейся нулем, содержащей пароль пользователя;

dwService тип вызываемой службы. Возможны следующие значения:

INTERNET_SERVICE_FTP – FTP-сервис,

INTERNET_SERVICE_GOPHER – Gopher-сервис,

INTERNET_SERVICE_HTTP – НТTP-сервис;

dwFlags - флаги. Возможны следующие значения:

INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE;

dwContext-обычно записывается 0,

Функция возвращает дескриптор FTP-, Gopher- или HTTP-соединения, соединение успешно или nil в случае ошибки.

 

Таблица 2

Константы, определяющие порт сервера

Константа Описание
INTERNET_DEFAULT_FTP_PORT Порт по умолчанию для FTP -сервера(21)
INTERNET_DEFAULT_GOPHER_PORT   Порт по умолчанию для Gopher-сервера (70)
INTERNET_DEFAULT_HTTP_PORT Порт по умолчанию для HTTP- сервера (80)
INTERNET_DEFAULT_HTTPS_PORT   Порт по умолчанию для НТТРS сервера(443)
INTERNET_DEFAULT_SOCKS_PORT   Порт по умолчанию для SOCKS firewall-сервера (1080)  

 

1.2.6. Функция «Найти первое вхождение файла с укачанным групповым именем» FtpFindFirstFile

 

function FtpFindFirstFile(

hConnect: HINTERNET;

IpszSearchFile: PChar;

var IpFindFileData:

TWin32FindData;

dwFlags: DWORD;

dwContext: DWORD): HINTERNET; stdcall;

где hConnect - дескриптор, полученный при выполнении функции InternelConnect;

IpszSearchFile - адрес строки, заканчивающейся нулем, которая содержит имя каталога и маску для поиска файлов;

IpFindFileData - адрес структуры WIN32_ FIND DATA, в которую записывается информация о найденном файле или каталоге. Данная структура содержит имя найденного файла и его атрибуты;

dwFlags- флаги;

dwContext - обычно записывается 0. Возвращаемое значение: в случае ошибки функция возвращает nil. При успешном выполнении возвращается дескриптор.

 

1.2.7. Функция «Найти следующие вхождения файла с указанным групповым именем» InternetFindNextFile

 

function InternetFindNextFile (

hFind: HINTERNET;

IpvFindData: Pointer). BOOL; stdcall;

где hFind - дескриптор, возвращаемый функциями FtpFindFirstFile или GopherFindFirstFile, или InternetOpenUrl (только каталоги);

IpvFindData - адрес структуры WIN32_FIND_DATA, в которую записывается информация о найденном файле или каталоге. Данная структура содержит имя найденного файла и его атрибуты.

Возвращаемое значение: возвращает TRUE при успешном выполнении или FALSE в случае ошибки.

 

1.2.8. Функция «Получить имя текущего Каталога на ftp-сервере» -FtpGetCurrentDirectory

 

function FtpGetCuircutDirectory(

hConnect: HINTERNET:

IpszCurrentDireetory: PChar;

var IpdwCurrenlDirectory: DWORD): BOOL; stdcall;,

где hConnect - дескриптор FTP-соединения (возвращаемый функцией InternetConnect);

IpszCurrentDireclory - адрес буфера, куда записывается строка, содержащая имя текущего каталога;

IpdwCurrentDirectory - длина буфера. Возвращаемое значение TRUE при успешном выполнении или FALSE в случае ошибки.

Примечание. Если буфер IpszCurrentDireclory имеет недостаточный размер, то в переменную IpdwCurrentDirectory записывается общая длина текущего каталога.

 

1.2.9. Функция чтения файла с HTTP-сервера FtpGetFile

 

function FtpGetFile(

hConnect: HINTERNET;

IpszReinoteFile: PChar;

IpszNewFile: PChar;

fFaillfExists:BOOL:

dwFlagsAndAttributes: DWORD;

dwFlags: DWORD; dwContext: DWORD): BOOL, stdcall;,

где hConnect - дескриптор соединения (возвращаемый функцией InternetConnect);

IpszRemoteFile - адрес строки, заканчивающейся двоичным нулем, которая содержит имя удаленного файла;

IpszNewFile - адрес строки, заканчивающейся двоичным нулем, которая содержит имя локального файла, в который будет переписан файл с FТР-сервера;

fFaillfExists - флаг определяет, как будет выполняться функция, если локальный файл уже существует. Если локальный файл с таким именем уже существует и флаг fFaillfExists установлен в TRUE, то функция FtpGetFile выполняться не будет;

dwFiagsAndAttribtites - определяет атрибуты нового файла. Возможны любые комбинации флагов FILE_ATTRIBUTE_*, используемых функцией CreateFile;

dwFlags - флаги преобразования копируемого файла. Возможны следующие значения флагов;

INTERNET_FLAG_TRANSFER_ASCII - преобразование файла в ASCII,

INTERNET_ FLAG_TRANSFER _BINARY - преобразование файла в двоичный;

dwContext - обычно записывается 0. Возвращаемое значение TRUE при успешном выполнении или FALSE в случае ошибки.

 

2. ЗАДАНИЕ ПО ПРАКТИЧЕСКОМУ ЗАНЯТИЮ

 

2.1. Создание клиентского приложения.

 

Создайте клиентское приложение, имеющее вид, показанный на рис. 1.

 

Рис. 1

 

Для чего на форму перенесите компоненты, перечисленные в табл.3.

 

Таблица 3

Компоненты приложения

Компонент Класс Описание
Label1 TLabel Метка «Введите URL» для Web-сервера
Label2 TLabel Метка «Введите адрес FТР-сервера»
Label3 TLabel Метка «Управление Web-сервером»
Label4 TLabel Метка «Управление FTP-сервером»
Label5 TLabel Метка «Удаленный файл»
Label6 TLabel Метка «Локальный файл»
Label7 TLabel Метка «Наименование каталога»
Memo1 TMemo Окно дня вывода прочитанного с Web-сервера файла
Memo2 TMemo Окно для вывода прочитанного с FTP-сервера файла или каталога
Edi1 TEdi 1 Окно ввода URL для Web-сервера
Edi2 TEdi 1 Окно ввода имени FTP-сервера
Edi3 TEdi 1 Окно ввода имени удаленного файла (файла наFTP-сервере)
Edi4 TEdi 1 Окно ввода имени локального файла (файла на локальном компьютере, куда будет записываться файл, прочитанный с FTP-сервера)
Edi5 TEdi 1 Окно ввода имени каталога на FTP-сервере
Button1 TButton Кнопка «Установить соединение» с Web-сервером
Button2 TButton Кнопка «Установить соединение» с РТР-сервером
Button3 TButton Кнопка «Текущий катален» для вывода на экран содержимого текущего каталога FTP-сервера
Button4 TButton Кнопка «Прочитать файл» с FTP-сервера
Button5 TButton Кнопка «Вывод каталога» FTP- сервера
Button6 TButton Кнопка «Очисти и окна»
Button7 TButton Кнопка «Выход»

 

Далее необходимо выполнить следующие действия:

1) Подключите библиотеку WinInet (сделайте ссылку на библиотеку в списке подключаемых модулей - uses):

 

uses

Windows, Messages, SysUtils, Variants, Classes. Graphics, Controls, Forms,

Dialogs, StdCtrls. WinInet;

 

2) В области глобальных переменных определите следующие дескрип­торы:

Var

Form 1: TForm l;

hsession, hconnect, hfile: hInternet;

3) Для события OnCreale формы Form1 запишите следующий про­граммный код:

 

Memo1.Clear;

Memo2.Clear;

// Имя файла, находящегося на Web-сервере

Edit 1.Text:= 'http://myself/www/index.html';

// Адрес FTP-сервера

Edit2.Text:='127.0.0.1';

// Имя файла, находящегося на FTP- сервере, который будет копиро­ваться в локальный каталог

Edit 3.Text:= 'fttp 1/Index.html';

// Имя локального файла, в который записывается файл,

// копируемый с FTP-сервера

Edit 4.Text:= 'C:\file.txt';

// Каталог' на FTP-сервере, содержимое которого выводится в окно Меmо2 Edit5.Text:= '/ftp1/*.*';

 

4) Для события OnClick кнопки «Установление соединения с WEB-сeрвером» запишите следующий программный код:

 

procedure TForm1.Button1 Click(Sender: TObject);

VAR

url: Siring:

buf: Array[1..100] of char;

dwtotal: dword;

s: String;

k: Integer;

begin

url:= Editl.Text;

If Pos(http://', Lowercase(url))=0 then (url):= 'http://'+url;

// Открытие сеанса связи

hSession:= InternetOpen(nil,

INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

If Assigned(hSession) then

begin

// Установление соединения по определенному URL

file:=intenetOpenUrlhSession, PChar(url),

nil, 0, INTERNET_FLAG_RELOAD, 0);

If Assigned(hfile) then

begin

// Чтение html-файла

internetReadFile(hfile, @buf, sizeof(buf), dwtotal);

s:= String(buf);

memo 1.Lines.Add(s);

// Закрытие соединения

InternetCloseHandle(hfile):

end:

// Завершение сеанса связи

InternetCloseHandle(hsession);

end;

end:

 

5) Для события OnClick кнопки «Установление соединения c FTP -сервером» запишите следующий программный код:

 

procedure TForm1.Button2CTick(Sender: TObject);

VAR

url: String:

srvname: Array [1..100] of char;

begin

url:= Edit2.Text;

StrPCopy(@srvname,url);

// Открытие сеанса связи

hSession:= IntemetOpen(nil, INTERNET_OPBN_TYPE_PRECONFIG

nil, nil. 0);

If Assigned(hSession) then

begin

// Установление соединения с РТР-сервером для пользователя anonymous

// и при отсутствии пароля

connect:= InternetConnect(hSession, @srvname, 21,

'anonymous', nil, INTERNET_SERVICE_FTP, 0, 0);

IF Assigned (connect) then

ShowMessage('Соединение с FTP-сервером установлено');

end;

end;

 

6) Для события OnCIick кнопки «Вывод каталога» запишите следующий программный код:

 

procedure TForm1.Buttun5Click(Sender: TObject);

VAR

DirInfo: W1N32_FIND_ DATA;

hDir: hInternet;

DirList: Array [1.. 100] of char;

dwflag: DWORD;

result: Boolean;

begin

StrPCopy(@DirLis1. Edit5.Text);

// Найти первый файл по указанному шаблону

hDir:= FtpFindFirstFile(hConnect, @DirList, DirInfo, dwFlag, 0);

// Обработка ошибок

if not Assigned(hdir) then

begin

if GetLastError()=ERROR_NO_MORE_FILES then

begin

ShovvMessage('B каталоге отсутствуют файлы');

InternetCloseHandle(hDir);

end

else

begin

ShowMessageFmt('Ошибка %d', [GetLastError ()]);

IntemetCloseHandle(hDir):

end;

end

else

begin

// Записать в поле Memo2 информацию об очередном найденном файле

memo2. Lines. Add(DirInfo.cFileName):

ifDirInfo.dwFileAttribules=FILE_ATTRIBUTE_DIRECTORY

then memo2.Lines.Add(DirInfo.cFileName+'<DlR>')

else memo2.Lines. Add(DirInfo.cFileName);

// В цикле ищутся все остальные файлы

repeat

result:= InternetFindNextFile (hDir, @DirInfo);

if not result then

if GetLastERROR()=ERROR_NO_MORE_FILES

Then InternetCloseHandle(hDir)

else

begin

ShowMessageFmt('Ошибка %d', [GetLastError ()]);

InternetCloseHandle(hDir);

end

else

begin

ifDirInfo.dwFileAttributes=FILE_ATTRIBUTE_DIRECTORY

then memo2.Lines.Add(DirInfo.cFiIeName+'<DIR>')

else memo2.Lines.Add(DirInfo.cFileName);

end;

until not result;

end;

end;.

 

ДОПОЛНИТЕЛЬНО ЗАДАНИЕ

 

1. Самостоятельно запрограммируйте событие OnClick кнопки «Теку­щий каталог», используя для этих целей функцию FtpGelCurrentDirectory.

2. Самостоятельно запрограммируйте событие OnClick кнопки «Про­читать файл», используя для этих целей функцию FtpGelFile.

3. Выполните чтение большого файла с Web-сервера при ограничен­ном размере буфера buf. В этом случае следует выполнить несколько по­следовательных чтений с Web-сервера. Признаком конца html-файла явля­ется тег </HTML>.

 

ЛИТЕРАТУРА

 

1. Грегори К. Использование Visual С++6. Специальное издание /Пер. с англ. М., Издательский дом «Вильяме», 1999. 864 с.

2. Озеров В. A. Delphi. Советы программистов. СПб., Символ-Плюс, 2004.976 е.

3. Джамса К., Коуп К. Программирование для INTERNET в среде Windows /Пер. с англ. СПб., Питер, 1996. 688 е.

 

КОНТРОЛЬНЫЕ ВОПРОСЫ

 

1. Назначение и основные функции протокола FTP.

2. Назначение и основные функции протокола HTTP.

3. Основные команды протокола FTP.

4. Основные команды протокола HTTP.

5. Назначение команды FTP.EXE.

6. Из каких частей состоит и для чего используется URL?


ЗАНЯТИЕ № 17



<== предыдущая лекция | следующая лекция ==>
Рабочих мест по условиям труда | С использованием протокола TFTP
Поделиться с друзьями:


Дата добавления: 2018-11-11; Мы поможем в написании ваших работ!; просмотров: 184 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Ваше время ограничено, не тратьте его, живя чужой жизнью © Стив Джобс
==> читать все изречения...

2222 - | 2165 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.01 с.