Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 186
Текст из файла (страница 186)
6гаи-НШ,61епсое/Мспгаи-Н111,ТЬе 6гои Несиогк/Мсбгаи-Н111,иасш111ап/Мссгаи- Нг11,Мспгаи-НШ Сопсешрогагу,мсбгаи-НШ 0161са1 Ьеагпапд,мсбгаи-Н111 Ргокевягопа1 Оене1оршепГ,БВА/Мспган-Н1 Ргеяв Епсег. 11,иг16ЬГ 6гооР/Мспгаи-Н111, Мсбгаи-НШ Н19Ьег Еопсас1оп,исбган-н111/ 1гигп,мсбгаи- НШ/Ргьш1в Сивкою РовагвЬ1пч,мс6гаи-Н111/Вуегвоп,Така/Мспгаи-Нг11,Мсбгаи- Нг11 гпсегашег1сапа,среп Сп1негвгсу Ргевв, Неа1гьсаге 1пгоппас1оп 6гоор, Р1аскв, Мсбгаин111 сопвггисг1оп, гптогшаг1оп а месга Бегч1сев" /> <мега паше="к(евсг1рс1оп" сопгепг="тье мсбгаи-нг11 сошрап1ев согрогаге НеЬв1се." /> <веса Ьсср-еяи1н="Соп Ргевв Епсег.
кепс-Туре" сопсепс="Гехс/Ьгш1т сьагяек=гво-8859-1"> <МЕТА НТТР-ЕООгн "Веггевь" СОНТЕНТ "900"> <МЕТА НТТР-ЕЯО1Ч="ЕХР1ВЕБ" СОНТЕНТ="-1"> <метл нттр-еООТч="Ргасша" сонтент="по-сасье"> <11пх ге1="всу1еяьеес" Ьгег="всу1евьеес.свв" гуре="Гехт/свв" шеова="всгееп,рго9есгг оп"> <11пн ге1="вгу1евьеег" Ьгег="рг1пс.свв" Гуре5еехс/свв" шесга="рггпс"> <всггрг 1апдоаде 5паназсггрг1.2" вгс="всг1ргв.5в"></всг1рг> Нажмите клавишу <Епсег>. Итак, выше приведена часть гипертекстового содержимого, полученного с веб-сайта издательства Мсбтатэ-Н!11 по адресу иии.
Мсбгаи-НШ . сош. В рассматриваемом здесь примере программы это содержимое просто выводится в исходном виде на экран посимвольно и не форматируется в удобочитаемом виде, как это обычно делается в окне браузера. 924 часть и. Библиотека Сз Проанализируем данную программу построчно. Прежде всего обратите внимание на использование в ней пространства имен зуз сев. Нею Как пояснялось ранее, в этом пространстве имен находятся классы сетевого подключения к Интернету. Обратите также внимание на то, что в данную программу включено пространство имен яуясев. 10, которое требуется для того, чтобы прочитать полученную с веб-сайта информацию, используя объект типа зсгеав.
В начале программы создается объект типа неЬнес)пеяс, содержащий требуемый ПК1. Как видите, для этой цели используется метод сгеасе (), а не конструктор. Это статический член класса неЬНес)оеяг. Несмотря на то что класс неЬНес(оеяг является абстрактным, это обстоятельство не мешает вызывать статический метод данного класса. Метод Бгеаке () воэвращает объект типа нссрнеЬНес)иеяг. Разумеется, его значение требуется привести к типу НССриеьцес(не як, прежде чем присвоить его переменной тес) ссылки на объект типа нссрнеЬНес)иеяю На этом формирование запроса завершается, но его еше нужно отправить по указанному 1) К1.
Для того чтобы отправить запрос, в рассматриваемой здесь программе вызывается метод Беснеяропяе () для объекта типа неьнес)оеяс. Отправив запрос, метод аеснеяропяе () переходит в состояние ожидания ответа. Как только ответ будет получен, метод Яесцеяропяе () возвратит объект типа ХеЬНеяропяе, в котором инкапсулирован ответ. Этот объект присваивается переменной геяр.
Но в данном случае ответ принимается по протоколу НТТР и поэтому полученный результат приводится к типу НггриеЬНеяропяе. Среди прочего в ответе содержится поток, предназначаемый для чтения данных из источника по указанному 1)К1. Далее поток ввода получается в результате вызова метода бегяеяропяезггеав() для объекта геяр. Это стандартный объект класса зсгеав со всеми атрибутами и средствами, необходимыми для организации потока ввода.
Ссылка на этот поток присваивается переменной 1ясгв, с помощью которой данные могут быть прочитаны из источника по указанному ПК1, как из обычного файла. После этого в программе выполняется чтение данных из веб-сайта издательства МсбгатчНВ1 по адресу кин. Мсагаи-Н111. сов и последующий их вывод на экрзи. А поскольку этих данных много, то они выводятся на экран отдельными порциями по 400 символов, после чего в программе ожидается нажатие клавиши <Епсег>, чтобы продолжить вывод.
Благодаря этому выводимые данные можно просматривать без прокрутки экрана. Обратите внимание на то, что данные читаются посимвольно с помощью метода кеас)дусе () . Напомним, что этот метод возвращает очередной байт из потока ввода в виде значения типа 1п с, которое требуется привести к типу снах. По достижении конца потока этот метод возвращает значение -1. И наконец, ответный поток закрывается при вызове метода С1ояе () для обьекта геяр. Вместе с ответным потоком автоматически закрывается и поток ввода.
Ответный поток следует закрывать в промежутках между последовательными запросами. В противном случае сетевые ресурсы могут быть исчерпаны, препятствуя очередному подключению к Интернету. И в заключение анализа рассматриваемого здесь примера следует обратить особое внимание наследующее:для отображения гипертекстового содержимого,получаемогоссервера, совсем не обязательно использовать объект типа НССриеЬНес)пеяг или НССриеЬНеяропяе. Ведь для решения этой задачи в данной программе оказалось достаточно стандартных методов, определенных в классах НеЬНес)оеяг и НеЬНеяропяе, и не потребовалось прибегать к специальным средствам протокола НТТР.
Следовательно, вызовы методов Бгеаге() и оеснеяропяе () можно было бы написать следующим образом: Глава 25. Сетевые средства подключения к Интернету 925 // Сначала создать объект запроса типа Хеонечпезс по указанному ПН1. Хеьпепиеяс геп = Хебвеппеяс.сгеаге("ЬГГр://иии.испган-п111.сои"); // Затем отправить сформированный запрос и получить на нето ответ. ХеЬКеяропяе геяр = геп.яеснеяропяе()~ В тех случаях, когда ие требуется приведение к конкретному типу реализации протокола, лучше пользоваться классами ИеЬНек(пеяс и ИеЬНезропзе, так как это дает возможность менять протокол, ие оказывая никакого влияния иа код программы. Но поскольку во всех примерах, приведенных в этой главе используется протокол НТТР, то в ряде примеров демонстрируются специальные средства этого протокола из классов НссриеЬНес(аеас и НссриеЬНезропзе.
Обработка сетевых ошибок Программа из предыдущего примера составлена верно, ио оиа совсем ие защищена от простейших сетевых ошибок, которые способны прелсдевремеиио прервать ее выполнение. Конечно, для программы, служащей в качестве примера, это ие так важно, как для реальных приложений.
Для полноценной обработки сетевых исключений, которые могут быть сгеиерироваиы программой, необходимо организовать контроль вызовов методов Сгеасе (), пег йеяропяе () и яескезропзеясгеаю() . Следует особо подчеркнуть, что геиерироваиие коикрегиых исключений зависит от используемого протокола. И ниже речь пойдет об ошибках, которые могут возникнуть при использовании протокола НТТР, поскольку средства сетевого подключения к Интернету, доступные в С(), рассматриваются в настоящей главе иа примере именного этого протокола.
Исключения, генерируемые методом Скеа~е () Метод Сгеасе (), определенный в классе ХеЬНек(пезс, может генерировать четыре исключения. Так, если протокол, указываемый в префиксе БК1, ие поддерживается, то генерируется исключение Хогяпррогсес)яхсерс1оп. Если формат ПК1 оказывается недействительным, то генерируется исключение Нг1рогюасяхсерГ1оп. А если у пользователя иет соответствующих полномочий для доступа к запрашиваемому сетевому ресурсу, то генерируется исключение яуя Сею. яеспг1Гу.
яеспг1суяхсерсфсп. Кроме того, метод сгеаге () генерирует исключение Агппюепсхп11ехсерс1оп, если ои вызывается с пустой ссылкой, хотя этот вид ошибки ие имеет непосредственного отношения к сетевому подключению. Исключения, генерируемые методом Ое~йеарое1ве () При вызове метода яебцезропзе() для получения ответа по протоколу НТТР может произойти целый ряд ошибок. Эти ошибки представлены следующими исключениями: 1пча11с(Орегаг1опяхсерГ1оп, Ргососо1Ч1о1аГ1опяхсерГ1оп, Хобяпррогсес(яхсерс1оп и ИеЬЕхсерГ1оп.
Наибольший интерес среди иих вызывает исключение ИеЬЕхсерГ1оп. У исключения ХеЬЕхсерГ1оп имеются два свойства, связанных с сетевыми ошибками: неяропзе и ягагпз. с помощью свойства незропзе можно получить ссылку иа объект типа ХеЬНезропзе в обработчике исключений. Для соединения по протоколу НТТР 926 Часть )!. Библиотека С» этот объект описывает характер возникшей ошибки. Свойство Ееяропяе объявляется следующим образом: рсЫас Иеьпеяропяе Хеяроляе ( Чест Когда возникает ошибка, то с помощью свойства Бсаьая типа иеьехсерс1оп можно выяснить, что именно произошло. Это свойство объявляется следующим образом: рсЫас иеЬЕхсерп1опзгасся Бгагся (Чею ) где ИеЬЕхсерс1опзсагпя — это перечисление, которое содержит приведенные ниже значения.
СоппессъопС1ояеб Соппесгга11оге МеяяасетелЧСЬЪаю1СЕхсеебеб Иаюекеяо1иггопГа11иге Ртре11лега11нге Кесегаега11оге ВеснеясггоЫЫСебэусаснеро11су ПессеясргоЫЫГебэургоху Бепбга11сге т1иеосс Бегчегргогосо1С1о1аг1оп тгияСГа11оге Как только будет выяснена причина ошибки, в программе могут быть предприняты соответствующие действия. Исключения, генерируемые методом ( еФЗ,езрое1зеЗ~геат () Для соединения по протоколу НТТР метод СеьееяропяеБсгеаю() из класса ИеЬЕеяропяе может сгенерировать исключение Рготосо1уъо1аС1опЕхсерС1оп, которое в целом означает, что в работе по указанному протоколу произошла ошибка. Что же касается метода яегееяропяеБггеаю (), то это означает, что ии один из действительиых ответных потоков недоступен. Исключение ОЬбестввярояебЕхсерт1оп геиерируется в том случае, если ответ уже утилизировав.