Г. Шилдт - С#4.0 Полное руководство (1160795), страница 208
Текст из файла (страница 208)
НССрнеЬНеяропяе геяр = (НССРХеЬНеяропяе) гея.оетнеяропяе()) // Получить из ответа поток ввода. 5ггеаш 1ятгш = геяр.БетнеяропяеВСгеаш() /* А теперь прочитать и отобразить гипертекстовое содержимое, полученное по указанному ПН1. Зто содержимое выводится на экран отдельными порциями по 400 символов. После каждой такой порции следует нажать клавишу <ЕХТЕК>, чтобы вывести на экран следугег/ю порцию иэ 400 символов.
*/ тот(1пт т=1;; 1++) ( сЬ = Тятпп.кеасвуге(); 11(сЬ == -1) Ьгеа)ы Сопяо1е.нттте((ссаг) сЬ)) 11((га400)==0) ( Сопяо1е.нгсте("1пНажмите клавишу <Ептег>."); Сопяо1е.неабьфпе()) ) Закрыть ответный поток. При этом закрывается также поток ввода 1ятгш. тевр.С1озе(); ) ) Ниже приведена первая часть получаемого результата.
(Разумеется, это содержимое может со временем измениться в связи с обновлением запрашиваемого веб-сайта, и поэтому у вас оно может оказаться несколько иным.) <Ьтпц > <Ьеаб> <слс1е>ноше — тсе мспган-нШ сошраптея</с1с1е> <шеСа паше="кеунотбя" сопеепт="Мсоган-НШ Сошраптея,мсоган-Нт11, Мсоган НШ, Лч1ат1оп Хеет, Вцятаеяянеет, 5Сапбагб апб Рооп'я, 5Сапбагт а Роог'я,СТВ/МсотанН111, 01епсое/МсПтан-Н111, Тле Бгон Хетнотт/Мсотан-Н111,масш111ап/Мсоган-Н111, Мсоган-Н111 Соптешрогату, Мсотан-Н111 0101та1 Ьеатптпд, Мсотан-Н111 Ртогеяя1опа1 Пече1оршепт,зял/Мсоган нажмите клавишу <епсег>. -Н111,нг10ЬС Пгоцр/Мсоган-Н111,мсоган-Н111 Нтвнег Еоцсагтоп,мсоган — НШ/ттнтп, Мсотан-Н111/Рг1штя Сцятош РцЬ11яЬ1пП,Мсоган-Н111/Нуегяоп,таеа/Мсоган-Н111, 1020 Часть (!. Библиотека С(г Мспгам-Н111 1пгегаеегьсапа,ереп Нпгжегв1Су Ргеев, Неа1ССсаге 1пгоппаггоп Отпер, Р1аССв, Мспгам-Н111 СопвггпсСьоп, 1пб>гвагьоп Ь Мебьа Бегт1сев" /> <мега паве="Оевсгьргьоп" сппгепС="тье Мсогам-Н111 Соерапгев СогрогаСе ИеЬв1Се." /> <мега СССР-еЧп1т Нажмите кпавгвпу <Епсег>.
Итак, выше приведена часть гипертекстового содержимого, полученного из вебсайта издательства МССгазу-Н)!! по адресу ммм. Мссгам-Н111. совс В рассматриваемом здесь примере программы это содержимое просто выводится в исходном виде на экран посимвольно и не форматируется в удобочитаемом виде, как это обычно делается в окне браузера. Проанализируем данную программу построчно. Прежде всего обратите внимание на использование в ней пространства имен Буегет. Нег.
Как пояснялось ранее, в этом пространстве имен находятся классы сетевого подключения к Интернету. Обратите также внимание на то, что в данную программу включено пространство имен Бувгем. 1О, которое требуется для того, чтобы прочитать полученную на веб-сайте информацию, используя объект типа БСгеавс В начале программы создается объект типа ИеЬНес(пезг, содержащий требуемый 1)И. Как видите, для этой цели используется метод Сгеасе (), а не конструктор. Это статический член класса МеЬНес(пееС. Несмотря на то что класс МеЬНе<(певС является абстрактным, это обстоятельство не мешает вызывать статический метод данного класса. Метод Сгеасе () возвращает объект типа НССрХеЬНес(певС.
Разумеется, его значение требуется привести к типу НССрнеЬНес(певС, прежде чем присвоить его переменной ге<( ссылки на объект типа НССриеЬНес(еееС. На этом формирование запроса завершается, но его еще нужно отправить по указанному ОЙ). Для того чтобы отправить запрос, в рассматриваемой здесь программе вызывается метод Беснееропее () для объекта типа иеьне<(певс. Отправив запрос, метод Бегйееропее () переходит в состояние ожидания ответа. Как только ответ будет получен, метод Бесневропве () возвратит объект типа хеьнезроаее, в котором инкапсулирован ответ. Этот объект присваивается переменной гевр. Но в данном случае ответ принимается по протоколу НТТР, и поэтому полученный результат приводится к типу НССриеЬНевропее.
Среди прочего в ответе содержится поток, предназначаемый для чтения данных из источника по указанному УВ!. Далее поток ввода получается в результате вызова метода БеСНевропееБСгеагл () для объекта геер. Это стандартный объект класса БСгеагл со всеми атрибутами и средствами, необходимыми для организации потока ввода. Ссылка на этот поток присваивается переменной 1зсгпь с помощью которой данные могут быть прочитаны из источника по указанному (.)К(, как из обычного файла. После этого в программе выполняется чтение данных из веб-сайта издательства МССгазт-Н!!! по адресу ммм.
мсБгам-Н111. согл и последующий их вывод на экран. А поскольку этих данных много, то они выводятся на экран отдельными порциями по 400 символов, после чего в программе ожидается нажатие клавиши <Еп(ег>, чтобы продолжить вывод. Благодаря этому выводимые данные можно просматривать без прокрутки экрана. Обратите внимание на то, что данные читаются посимвольно с помощью метода Не а<(Бусе ( ) . Напомним, что этот метод возвращает очередной байт из потока ввода в виде значения типа гпс, которое требуется привести к типу сьаг.
По достижении конца потока этот метод возвращает значение -1. И наконец, ответный поток закрывается при вызове метода Е1ове () для объекта геер. Вместе с ответным потоком автоматически закрывается и поток ввода. Ответный Глава 26. Сетевые средства подключения к Интернету 1021 поток следует закрывать в промежутках между последовательными запросами. В противном случае сетевые ресурсы могут быть исчерпаны, препятствуя очередному подключению к Интернету. И в заключение анализа рассматриваемого здесь примера следует обратить особое внимание на следующее: для отображения гипертекстового содержимого, получаемого от сервера, совсем не обязательно использовать объект типа нггриеьнес(пеяг или н гриеЬНеяропяе.
Ведь для решения этой задачи в данной программе оказалось достаточно стандартных методов, определенных в классах иеЬнес)не я г и иеЬне ярон яе, и не потребовалось прибегать к специальным средствам протокола НТТР. Следовательно, вызовы методов сгеаге () и сегнеяропяе () можно было бы написать следующим образом. О Сначала создать объект запроса типа НеЬКечнеяс по укаэанному Снг. Иепнейнеяь геЧ = ИеЬНейнеяс.сгеасе('ЬГГр://ннн.нсоган-н111.сот"); // Затем отправить сформированный запрос и получить на него ответ.
Неьйеяропяе геяр = гей.оетаеяропэе(); В тех случаях, когда не требуется приведение к конкретному типу реализации протокола, лучше пользоваться классами ИеЬНес)пеяс и ИеЬНеяропяе, так как это дает возможность менять протокол, не оказывая никакого влияния на код программы. Но поскольку во всех примерах, приведенных в этой главе, используется протокол НТТР, то в ряде примеров демонстрируются специальные средства этого протокола из классов НГГрнеЬНес)иеят и НГГрнеЬНеяропяе. Обработка сетевых ошибок Программа из предыдущего примера составлена верно, но она совсем не защищена от простейших сетевых ошибок, которые способны преждевременно прервать ее выполнение.
Конечно, для программы, служащей в качестве примера, это не так важно, как для реальных приложений. Для полноценной обработки сетевых исключений, которые могут быть сгенерированы программой, необходимо организовать контроль вызовов методов сгеаге (), сегнеяропяе () и Сегнеяропяезггеаге () .
Следует особо подчеркнуть, что генерирование конкретных исключений зависит от используемого протокола. И ниже речь пойдет об ошибках, которые могут возникнуть при использовании протокола НТГР, поскольку средства сетевого подключения к Интернету, доступные в СФ, рассматриваются в настоящей главе на примере именно этого протокола. Исключения, генерируемые методом Сееа~е () Метод Сгеасе (), определенный в классе ИеЬНецпеяб, может генерировать четыре исключения.
Так, если протокол, указываемый в префиксе Бръ1, не поддерживается, то генерируется исключение иогБпррогбес(Ехсерб1оп. Если формат БВ1 оказывается недействительным, то генерируется исключение Нг1рогваГЕхсерГ1оп. А если у пользователя нет соответствующих полномочий для доступа к запрашиваемому сетевому ресурсу, то генерируется исключение Буягет. Зесигфгу. Неснгфгуехсергфоп. Кроме того, метод сгеаге () генерирует исключение йгопгеепгнн11ехсерг1оп, если он вызывается с пустой ссылкой, хотя этот вид огпибки не имеет непосредственного отношения к сетевому подключению. 1022 Часть!!. Библиотека С() Исключения, генерируемые методом Се~аеврог(ве () При вызове метода ОеСКеяропяе () для получения ответа по протоколу НТТР может произойти целый ряд ошибок.
Эти ошибки представлены следующими исключениями: 1пна11бОрегапгопЕхсерс1оп, Ргогосо1УТо1а11опЕхсер11оп, носэпрроггебЕхсергйоп и ИеЬЕхсерггоп. Наибольший интерес среди них вызывает исключение иеЬЕхсерсгоп. У исключения ИеЬЕхсер11оп имеются два свойства, связанных с сетевыми ошибками: кеяропяе и Бсаспя. С помощью свойства кеяропяе можно получить ссылку на объект типа ИеЬКеяропяе в обработчике исключений. Для соединения по протоколу НТТР этот объект описывает характер возникшей ошибки.