Г. Шилдт - С#4.0 Полное руководство (1160795), страница 211
Текст из файла (страница 211)
НССрнеЬКес)оеяС геЧ = (НССрнеЬКеяг(еЯС) ИеЬКеяоеяС.Сгеаее(пггятг)) ог1згг = по11: // запретить дальнейшее использование етого ОК1 О Отправить сформированный запрос и получить на него ответ. геяр = (НССрнеЬКеяропяе) геЧ.Оегяеяропяе()) // Получить поток ввода из принятого ответа. 1032 Часть 11. Библиотека 0№ Богеаш 1зггш = геяр,ОепеезропяеБГгеаш()) // Заключить поток ввода в оболочку класса ЯпгеашНеабег. Богеашаеабег гбг = пен Яогеашаеабег(гягпв)) Прочитать всю страницу. яог = гбг.кеабтоЕпб()) спг1ос = О) бо ( // Найти следующий ОЕ1 для перехода по ссылке. 11пк = Г1пб11пк(ясг, гес спг1ос)) 11(11пк != по11) Сопяо1е.кггпеЬгпе("Найдена ссылка: " + 11пк) Сопяо1е.нггпе("Перейти по ссылке, Искать дальше, Выйти?" ) апвнег = Сопяо1е.ееаб11пе(); 11(згг1пЧ.ЕЧоа1з(апзнег, "П", ЯпггпоСошрагсяоп.огб1па11спогесаяе)) ( сгаяпг = ясгфпц.Сору(11пк)) Ьгеак) ) е1*е 11(япг1пс.Ес(па1я(апянег, "В", БоглпцСошрагбяоп.огбепа11дпогеСаяе)) ( Ьгеа)с) ) е1зе 11(згг1по.ес(ча1в(апянег, "и", БоглпцСошраг1яоп.огб1па11дпогеСаяе)) ( Сопяо1е.иг1се11пе("Поиск следугщей ссылки.") ) ] е1зе ( Сопзо1е.кгтсеаапе("Больше ссылок не найдено.") Ьгеа)с) ) ) ни11е(11пК.ЬепсГЬ > О); // Закрыть ответный поток, 11(геяр != пп11) гевр.С1ояе(); ни11е(ог1япг != пп11); ) сассь(иеьехсерггоп ехс) ( сопяо1е.игльеь1пе("сетевая ошибка: " + ехс.меяяасе + "1пкод состояния: " + ехс.ягагся); сассЬ(ргооосо1оао1аобопЕхсеролоп ехс) Сопяо1е.йглгеЬ1пе("Протокольная ошибка: " + ехс.Меяяаое)) сапсЬ(сгг№опяаГЕхсерпгоп ехс) ( сопяо1е.иглсеь1пе("Ошибка формата пет: " + ехс.меяваде)) ] сапсЬ(иоГЯпррогпебЕхсерп1оп ехс) ( сопяо1е.нг1сеь1пе("неизвестньят протокол: " + ехс.меязаде)) сассЬ(1ОЕхсерслоп ехс) ( Сопяо1е.иг1сеЬ1пе("Ошибка ввода-вывода: " т ехс.Незвале)) ) 11па11у ( 11(гезр != пп11) гевр.с1ове(); ) Глава 26.
Сетевые средства подключения к Интернету ЮЗЗ Сопяо1е.вггое11пе ("Завершение программы М1пгогам1ег. ") г ) ) Ниже приведен пример сеанса поиска, начиная с адреса ммм. МсПга и-Н 111. сов. Следует иметь в виду, что конкретный результат поиска зависит от состояния содержимого на момент поиска. Переход по ссылке Ьггр://в<оган-Ь111.сов найдена ссылка: Ьсср:!йс1.волгам-Ь111.сов:9000/с91-Ьгп/чоегуувяя=яеагсьарч=ай Перейти по ссылке, Искать дальше, Выйтит И Поиск следукшей ссылки. Найдена ссылка: Воср:/угптеяяог.всчгам-нг11.сов/рьоепгх.хьгв12с=96562ар=гго1-1гнове Перейти по ссылке,.Искать дальше, Выйтит П переход по ссылке ьсср:Огптеясог.почтам-ь111.сов/рьоепгх.яьгв12с=96562ар=гго1-ггьове Найдена ссылка: Ьггр://ммн.всчгам-Ь111.сов/1псех.нов1 Перейти по ссылке, Искать дальше, Выйтиз П Переход по ссылке Ьггр://ммм.всчган-Ь111.совЯпг)ех.ьгв1 найдена ссылка: ьсср://ясг.всчган-ь111.сов:9000/<91-ьгпучоегузвяя=яеагсььрч=ай Перейти по ссылке, Искать дальше, Выйти".
В Завершение программы Мгпгогам1ег. Рассмотрим подробнее работу программы М(п)Сгамг)ег. Она начинается с ввода пользователем конкретного !(Е! в командной строке. В методе Ма1п ( ) этот УК! сохраняется в строковой переменной сгаягг. Затем по указанному !)К1 формируется запрос, и переменной их а я С г присваивается пустое значение, указывающее на то, что данный 1)Е! уже использован. Далее отправляется запрос и получается ответ. После этого содержимое читается из потока ввода, возвращаемого методом песнеяропяеБсгеав () и заключаемого в оболочку класса зггеавнеаг)ег. Для этой цели вызывается метод Неас)ТоЕпс( (), возвращающий все содержимое в виде строки из потока ввода. Далее программа осуществляет поиск ссылки в полученном содержимом. Для этого вызывается статический метод Р1пс)11п)г (), определяемый в программе М(п(Сгаьу)ег.
Этот метод вызывается со строкой содержимого и исходным положением, с которого начинается поиск в полученном содержимом. Эти значения передаются методу Г1пг)11пх () в виде параметров ьгв1ясг и ясаг11ос соответственно. Обратите внимание на то, что параметр ясагс1ос относится к типу геу. Сначала в методе р1пс)11пх () создается копия строки содержимого в нижнем регистре, а затем осуществляется поиск подстроки Ьге г="ЬЬ Ьр, обозначающей ссылку. Если эта подстрока найдена, то !)Е! копируется в строковую переменную пг1, а значение параметра ягагс1ос обновляется и становится равным концу ссылки. Но поскольку параметр я гагг1ос относится к типу ге1, то это приводит к обновлению соответствующего аргумента метода Маап (), активизируя поиск с того места, где он был прерван. В конечном итоге возвращается значение переменной ог1.
Эта переменная инициализирована пустым значением, и поэтому если ссылка не найдена, то возвращается пустая ссылка, обозначающая неудачный исход поиска. Если ссылка, возвращаемая методом р1пОЬЕПК ( ), не является пустой, то она отображается в методе Маап (), и далее программа запрашивает у пользователя очередные действия. Пользователю предоставляются одна из трех следующих возможностей: перейти по найденной ссылке, нажав клавишу <П>, искать следующую ссылку в имеющемся содержимом, нажав клавишу <И>, или же выйти из программы, нажав клавишу <В>. Если пользователь нажмет клавишу <П>, то программа осуществит переход по найденной ссылке и получит новое содержимое по этой ссылке. После этого поиск 1034 Часть 11.
Библиотека С№ очередной ссылки будет начат уже в новом содержимом. Этот процесс продолжается до тех пор, пока не будут исчерпаны все возможные ссылки. В качестве упражнения вы сами можете усовершенствовать программу МппСгату!ег, дополнив ее, например, возможностью перехода по относительным ссылкам. Сделать это не так уж и трудно. Кроме того, вы можете полностью автоматизировать поисковый робот, чтобы он сам переходил по найденной ссылке без вмешательства со стороны пользователя, начиная со ссылки, обнаруженной на самой первой странице полученного содержимого, и продолжая переход по ссылкам на новых страницах. Как только будет достигнут тупик, поисковый робот должен вернуться на один уровень назад, найти следующую ссылку и продолжить переход по ссылке.
Для организации именно такого алгоритма работы программы вам потребуется стек, в котором должны храниться идентификаторы УК) и текущее состояние поиска в строке (3Е(. С этой целью можно, в частности, воспользоваться коллекцией класса есас)г. В качестве более сложной, но интересной задачи попробуйте организовать вывод ссылок в виде дерева. Применение кйасса ЯеЬС1~еп~ рчЬ11с ХеЬС11епС() Кроме того, в классе ИеЬС11епс определяются свойства, сведенные в табл. 26.6, а также целый ряд методов, поддерживающих как синхронную, так и асинхронную передачу данных.
Но поскольку рассмотрение асинхронной передачи данных выходит за рамки этой главы, то в табл. 26.7 приведены только те методы, которые поддерживают синхронную передачу данных. Все методы класса ХеЬС11епС генерируЮт исклЮчение ХеЬЕхсергсоп, если во время передачи данных возникает ошибка. Таблица 2В.В. Свойства, определенные в классе ХеЬС11епС Свойство Описание рпЬ11с всг1по Ваведг(с(геев ( пест весг ) Получает или устанавливает базовый адрес требуемого ()й). Если это свойство установлено, то адреса, задава- емые в методах класса хеЬс11епс, должны опреде- ляться относительно этого базового адреса Получает или устанавливает правила, определяющие, когда именно используется кэш' Получает или устанавливает мандат, т.е.
учетные дан- ные пользователя. По умолчанию это свойство имеет пустое значение Получает или устанавливает схему кодирования симво- лов при передаче строк рпЬ11с ЕечпевССасиеро11су Сасперо11су ( оеС; веС; рпЬ11с 1Сгег(епС1а1в сгес)епс1а1в ( пес г вес," ) рпЬ11с Епсос)1пгт Епсос)1по ( песг вес; ) В заключение этой главы уместно рассмотреть класс иеЬс11епс. Как упоминалось в самом ее начале, класс ИеЬС11епС рекомендуется использовать вместо классов ХеЬКес(певС и ИеЬЕевропве в том случае, если в приложении требуется лишь выгружать или загружать данные из Интернета.
Преимущество класса ИеЬС11епС заключается в том, что он автоматически выполняет многие операции, освобождая от их программирования вручную. В классе ИеЬС11епС определяется единственный конструктор. Глава 26. Сетевые средства подключения к Интернету 1035 Окончание табл. 2б.б Свойство Описание рпЫдс ХеЬНеабегСо11ессдоп Неабегз( дегг зеЫ ) рпЬ11с Ьоо1 15Нпзу( дЕСГ ) Получает или устанавливает коллекцию заголовков за- проса Принимает логическое значение сгсе, если данные по-прежнему передаются по запросу, а иначе — логи- ческое значение Г515е Получает или устанавливает прокоп-сервер рпЬ11с 1неЬРгоху Ргоху ( дег; зегг роЫдс НаглеЧ51пеСо11ес51оп СоегуБгг1пд ( дегг зеЫ Получает или устанавливает строку запроса, состоящую из пар "имя-значение", которые могут быть присоединены к запросу. Строка запроса отделяется от 0Я! символом?.