Взаимодействие с сервером WWW
Сервера WWW предоставляют пользователям возможность просмотра гипертекстовой информации. Вся информация, расположенная на сервере, разделена на небольшие страницы.
Когда вы соединяетесь с сервером WWW с помощью какой-нибудь программы навигатора, например Microsoft Internet Explorer или Netscape Navigator, то вы увидите, что страницы могут содержать не только форматированный текст и гипертекстовые ссылки, но также рисунки, аудио и видео информацию. Некоторые страницы даже могут содержать органы управления диалоговых панелей - поля ввода, кнопки, переключатели.
Как же удается сочетать столь разнообразную информацию в одном документе? Оказывается сами страницы, адрес которых вы указываете навигатору, содержат описание на языке разметки гипертекста HTML (Hyper Text Markup Language) и хранятся в файлах с расширениями htm или html. Навигатор загружает файл страницы, а затем интерпретирует его и отображает на экране. При этом он, возможно, будет загружать и другие файлы с сервера, например файлы изображений или анимации.
В листинге 3.1 представлен пример страницы WWW, содержащей в себе текст, изображение и ссылки на другие страницы WWW (это главная рускоязычная страница нашего сервера WWW).
Листинг 3.1. Файл main.htm
<HTML>
<BODY BGCOLOR="#FFFFFF">
<BGSOUND SRC="../midi/bach.mid"></BGSOUND>
<!-- <embed src="../midi/bach.mid" width=2 height=2 hidden="yes"
autostart="true" loop=1> -->
<H2>Добро пожаловать на наш сервер WEB!</H2>
<P>На этом сервере вы можете найти подробную информацию
о наших книгах из серий "Персональный компьютер.
Шаг за шагом" и "Библиотека системного программиста":
<UL>
<LI>аннотации и оглавления;
<LI>исходные тексты программ, опубликованных в книгах;
<LI>наши планы на будущее;
<LI>список ошибок, замеченных в наших книгах;
<LI>информацию о наших друзьях;
<LI>бесплатные книги, доступные в режиме online
</UL>
Эти серии книг предназначенны для самого широкого
круга людей, чья работа связана с компьютерами.
<P>Мы подготовили для вас и кое-что еще!
<CENTER><HR>
Эту страницу лучше всего просматривать навигаторами MS Internet Explorer v3.0 или Netscape Navigator
<TABLE><TR><TD>
<A HREF="http://www.microsoft.com/ie"><IMG SRC="ieanim.gif"
ALT="MS Internet Explorer v3.0" BORDER=0></A>
</TD><TD>
<A HREF="http://home.netscape.com"><IMG SRC="netnow3.gif
" ALT="Netscape Navigator" BORDER=0></A>
</TD></TR></TABLE>
<P><IMG SRC="http://www.dials.ccas.ru/scripts/w3count.exe?frolov1"
ALIGN=bottom><BR>
<FONT SIZE=2>Посылайте ваши комментарии по адресу
<A HREF="mailto:frolov@glas.apc.org" >frolov@glas.apc.org</A></FONT>
<BR><FONT SIZE=1>© Александр Фролов, Григорий Фролов, 1997</FONT>
</CENTER>
</BODY>
</HTML>
Как видите, исходный текст страницы WWW, хранящийся на сервере, имеет мало общего с изображением этой странице в окне навигатора. Чтобы вывести страницу на экран, навигатор проделывает большую работу. Он загружает все необходимые файлы изображений, аудио и видео, которые включены в данную страницу, а затем отображает страницу на экране, руководствуясь операторами языка HTML.
¨ Описание языка HTML и процедуры создания страниц WWW вы можете найти в 29 томе серии “Библиотека системного программиста”, который называется “Сервер WEB своими руками”.
Самостоятельная обработка исходных файлов HTML достаточно проста, хотя и требует очень большой и кропотливой работы, так как по сути, вам будет нужно создать интерпретатор языка HTML. Чтобы не загромождать исходные тексты наших приложений, мы не будем обрабатывать полученные страницы WWW, а основное внимание уделим процедуре взаимодействия с сервером.
Если ваше приложение должно загружать с сервера страницы WWW и отображать их на экране, не выполняя дополнительной обработки, вы можете воспользоваться органом управления Microsoft Web Browser Control. Мы расскажем про этот орган управления в главе “Ваш собственный Internet Explorer”.
Сначала необходимо инициализировать сеанс связи с Internet. Для этого надо создать объект класса CInternetSession, или класса наследованного от CInternetSession.
Затем вы должны открыть соединение с сервером WWW. Для этого надо вызвать метод GetHttpConnection класса CInternetSession. Методу GetHttpConnection указывается адрес сервера WWW. Он создает объект класса CHttpConnection. Этот объект будет представлять в вашем приложении указанный сервер WWW.
В отличие от метода GetFtpConnection класса CInternetSession, рассмотренного нами ранее, GetHttpConnection на самом деле не выполняет настоящего соединения с сервером. Поэтому даже если указать ему имя несуществующего сервера, он создаст объект класса CHttpConnection без сообщения об ошибке. Настоящее соединение с сервером будет установлено значительно позже, во время передачи серверу WWW запроса.
Теперь надо создать (открыть) и подготовить запрос для передачи серверу. Для этого вызвите метод OpenRequest класса CHttpConnection. Он создаст объект класса CHttpFile. Вы можете добавить к созданному запросу дополнительные заголовки. Для этого надо воспользоваться методом AddRequestHeaders класса CHttpFile.
Когда запрос полностью сформирован, его следует передать серверу с помощью метода SendRequest класса CHttpFile. Этот метод передает запрос указанному серверу. Именно в это время устанавливается сетевое соединение. Если запрос передан успешно, тогда метод SendRequest возвращает значение TRUE. Если указанный сервер не существует или на нем отсутствует запрашиваемый файл - возвращается значение FALSE и может быть вызвано исключение CInternetException.
Далее следует получить ответ на запрос от сервера. Для этого вызовите метод QueryInfo класса CHttpFile. В некоторых случаях, когда надо только проверить существует ли страница с указанным адресом этого уже достаточно.
Если же вам необходимо загрузить страницу с сервера на локальный компьютер, вы можете воспользоваться методом Read. Этот метод определен в классе CInternetFile, который является базовым для класса CHttpFile.
Если во время чтения файла прервется связь с сервером или произойдут другие непредвиденные события, то метод Read может вызвать исключение CInternetException. Чтобы приложение правильно обрабатывало ошибки WinInet, вы должны поместить все методы, которые могут вызвать исключение в блок try и определить для него соответствующий блок catch.
В следующем разделе мы предложим вашему вниманию приложение ConsoleHTTP, которое выполняет соединение с указанным сервером WWW. Используйте исходный текст этого приложения как шаблон для изучения основных приемов работы с серверами WWW.