Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 188
Текст из файла (страница 188)
Эта коллекция специально предназначена для хранения пар "имя-зиачение" и применяется аналогично любой другой коллекции (подробиее об этом см. в главе 24). Строковый массив имен может быть получен из свойства )(11Кеуз, а отдельные значения — по соответствующему имени при вызове метода 6ест/а1пез () . Этот метод возвращает массив стротс содержащий значения, связаииые с заголовком, передаваемым в качестве аргумента. Метод бегт/а1пез () перегрУжается, чтобы привять числовой индекс или имя заголовка.
В приведенной ниже программе отображаются заголовки, связанные с сетевым ресурсом, доступным по адресу ыын. Мсбгаы-Н111. сов. 932 Часть П. Библиотека С» Доступ к сооЫе-наборам Для доступа к сооЫе-наборам, получаемым в ответ по протоколу НТТР служит свойство Соокаея, определенное в классе НссриеЬНеяропзе. В сооЫе-наборах содержится информация, сохраняемая браузером. Оии состоят из пар "имя — значение" и упрощают некоторые виды доступа к веб-сайтам. Ниже показано, каким образом определяется свойство СооК1ея, риЬ11с Сооь1есо11еск1оп Сооиьея ( Чеке яек; ) В классе Соо)с1еСо11есг1оп реализуются интерфейсы 1Со11есдаоп и 1ЕппюегаЬ1е, и поэтому его можно использовать аналогично классу любой другой коллекции (подробнее об этом см.
в главе 24). У этого класса имеется также иидексатор, позволяющий получать сооЫе-иабор по указанному индексу или имени. В коллекции типа соок1есо11ессаоп хранятся объекты класса соокае. В классе Соох1е определяется несколько свойств, предоставляющих доступ к различным фрагментам информации, связанной с сооЫе-набором. Ниже приведены два свойства, Наюе и т/а1ие, используемые в примерах программ из этой главы. рпвььс леггорн вазе ( дека яект ) риььгс якгьпд Оа1ие ( сект яект ) Имя сооЫе-Набора содержится в свойстве наюе, а его значение — в свойстве (та1пе. Для того чтобы получить список сооЫе-Наборов из принятого ответа, необходимо предоставить сооЫе-коптейиер с запросом. И для этой цели в классе нссриеьнес)пеяс определяется свойство Соок1еСопдаапег, приведенное ниже.
рпвьгс СоохаеСопСаапег Соох(есопСа(пег ( сект яек," ) В классе Соо)к1еСопбаапег предоставляются различные поля, свойства и методы,позволяющие хранить сооЫе-иаборы. По умолчанию свойство соох1еСоппаапег содержит пустое значение. Для того чтобы воспользоваться сооЫе-наборами, необходимо устаиовить это свойство равным экземпляру класса Соох1еСопга1пег. Во многих приложениях свойство СоокаеСопдаапег ие применяется непосредственно, а вместо него из принятого ответа составляется и затем используется коллекция типа соо)г1есо11есс1оп.
Свойство Соок1есопса1пег просто обеспечивает внутренний механизм сохранения сооЫе-наборов. В приведенном ниже примере программы отображаются имена и значения сооЫенаборов, получаемых из источника по (з к(, указываемому в командной строке. Следует, однако, иметь в виду, что сооЫе-Наборы используются ие иа всех веб-сайтах, поэтому нужно еще найти такой веб-сайт, который поддерживает сооЫе-наборы. /* Пример проверки соох1е-набороз.
ддя того чтобы проверить, какие именно соои1е-наборы используютоя на зеб-сейте, укажите его имя з командной строке. Так, если назвать зту программу Соохьебезо, то по команде Соо)каевешо Ьккрт//мзп.сов отобразятся соохге-наборы с зеб-сайта по адресу нны.юяп.соз. */ пя1пд Зуясеют Глава 25. Сетееые средстеа подключения к Интернету 933 цягпд Яуясез.нег; с1азз Соон1еоезо ( ягастс чо1б Маго(ясггпд[) агдя) ( 11(агдя,Ьепдгп != 1) ( Сопяо1е.йг1сеьтпе("Применение: Соойгеоезо <нгг>")т гесцгп; ) // Создать обьект запроса типа ИеЬаедиеяс по указанному ОН1.
НссрйеЬаедцеяс гед = (Нссрйепаедцеяс) иеьнедцеяг .сгеаге (агдя ( О) ) т // Получить пустой контейнер. гед.СоонтеСопсагпег пен СоойьеСопса1пег() // Отправить сФормированный запрос и получить на него ответ. НссрИеЬВеяропяе гьяр = (Нссрйебйеяропяе) гед.песнеяропяе()т // Отобразить соон1е-наборы.
Сопяо1е.йггсеьгпе("Количество сосите-наборов: геяр.Соойфея.Соцпс)) Сопяо1е.йгтсеьтпе("(0,-20)(1)", "Имя", "Значение" ); гог(1пс 1=0) 1 < геяр.Соон1ез.Соцпст 1++) Сопяо1е.йггсеьтпе("(О, -20)(1)", геяр.соонтея[1).нате, геяр.сооктея[1).ча1ие)) // Закрыть ответный поток. геяр.С1ояе()т ) ) Применение свойства у.аз~моЖЕ~ес1 Иногда требуется знать, когда именно сетевой ресурс был обновлен в последний раз.
Это нетрудно сделать, пользуясь сетевыми средствами класса нггриеьнеяропяе, среди которых определено свойство Ьазсмот)1г1ес[, приведенное ниже. рцЬ11с оасетгзе ЬаяГМоб111еб ( дест С помотпью свойства ьазсмоб111еб получается время обновления содержимого сетевого ресурса в последний раз. В приведенном ниже примере программы отображаются дата и время, когда был в последний раз обновлен ресурс, указываемый по Г)т<1 в командной строке. /* Использовать свойство Ьаясмоб111еб.
Для того чтобы проверить дату последнего обновления веб-сайта, введите его ОН1 в командной строке. Так, если назвать эту программу Ьаясног(111еаоеио, то для проверки даты последней модификации веб-сайта по адресу ннн.НегЬБсп11бс.соз введите команду 934 Часть Н. Библиотека С№ Ьаевиок(1№ьекп)емо Ьевр: //Иекьясв№1к(Ь. сом */ цвьпд зувкеит цв1пп зувкеи.иеят с1авв Ьавкиот(111ес(пеео ( втакьс тога Ма[п(яккгпд[) агаев) ( 11(агфа.Ьепдкь != 1) ( Сопво1е.иг1кеЬ1пе("Применение: ЬавСМосьтьеопеео <цг1>")т гетцгпт ) Нскриеькепцевк кея = (Нкприеьвепцевь) ХеЬНепцевС.Сгеаяе(акдв[0])т Нккриеькевропве гевр = (Нккриеькевропве) геп.пеСЯевропве()) Сопво1е.икгке11пе("Последняя модификация: " Е гевр.ьавкиоа111ек))т гевр.С1ове()т ) ) Практический пример создания программы М~п~Сгаи!ег Для того чтобы показать, насколько просто программировать для Интернета средствами классов хеьнес[цевс и иеьнеропве, обратимся к разработке скелетиого варианта поискового робота под названием М(п]Сгату)ег.
Поисковый робот представляет собой программу последовательного перехода от одной ссылки на сетевой ресурс к другой. Поисковые роботы применяются в поисковых механизмах для каталогизации содержимого. Разумеется, поисковый робот М]шСгащ!ег не обладает такими развитыми возможностями, как те, что применяются в поисковых механизмах. Эта программа начинается с ввода пользователем конкретного адреса с)21, по которому затем читается содержимое и осуществляется поиск в нем ссылки.
Если ссылка найдена, то программа запрашивает пользователя, желает ли он перейти по этой ссылке к обнаруженному сетевому ресурсу, найти другую ссылку на имеющейся странице или выйти из программы. Несмотря иа всю простоту такого алгоритма поиска сетевых ресурсов, он служит интересным и наглядным примером доступа к Интернету средствами С№.
Программе М[п[Сгату]ег присущ ряд ограничений. Во-первых, в ией обнаруживаются только абсолютные ссылки, указываемые по гипертекстовой команде ьгег= "ьсср. Относительные ссылки при этом ие обнаруживаются. Во-вторых, возврат к предыдущей ссылке в программе не предусматривается.
И в-третьих, в ней отображаются только ссылки, но не окружающее их содержимое. Несмотря на все указанные ограничения данного скелетного варианта поискового робота, он вполне работоспособен Глава 25, Сетевые средства подглюченнл к Ннтернету 935 и может быть без особых хлопот усовершенствован для решения других задач. На самом деле добавление новых возможностей в программу М(п(Стати(ег — 'зто удобный случай освоить на практике сетевые классы и узнать больше о сетевом подключении к Интернету. Ниже приведен полностью код программы М(п(Сгачу)ег. /* М1пгсгаы1ег: скелетный вариант поискового робота. Применение: для запуска поискового робота укажите 'ОН1 в командной строке.
Например, для того чтобы начать поиск с адреса ыын.исогаы-н111.сов, введите следующую команду: ИьпаСкаы1ек 1Шр: //Исйкаы-Н111. сов иягпо Яуясевт ия1по Яуягев.неге ия1по Яуясев.101 с1азз М1пЕСган1ег ( // Найти ссылку в строке содержимого. ясасгс зсгтпо Г1пбвьпн(ясг1пц Ьсв1ясг, геЕ Епс ясагс1ос) ( Епг 1) Епс зсагс, епбт зсгьпс игь = пи111 ясг1пд 1онсазезгг Ьсв1зсг.тоьонег()т г = 1онсаяезгг.1пбехое("ьгее=ч"ьггр", згагг1ос); 1Е(1 )= -1) ( ясагс = Ьсв1зсг.1пбехОЕ('"', 1) ч 11 епб = Ьсв1зсг.1пбехОЕ('"', ясагс); игг = ьгв1згг.Яиьзггьпд(згагг, епб-ягагг); ясагс1ос " епой ) гесигп иг11 зсастс ноги Магд(зсгтпо() агся) ( 5ГГЕпо 11пн пи111 зсг1по вггт ясггпц апянегт Епг сиг1ост // содержит текущее положение в ответе ЕЕ(агоя.ЬепЧГЬ != 1) ( сопзо1е.нгьгеььпе("Применение: м1пЕСгаы1ег <игь>") гесигп т ) зсгтпд игтзсг = агсз(0)т // содержит текущий ОН1 936 часть )).
Библиотека С» ггу ( до ( сопяо1е.игьгеО1пе("переход по ссылке " +иг1вгг)> // Создать объект запроса типа Иепйейиевс // по указанному ОК1. Нгсрнепнейиевс гей = (НссрнеЬКедиевс) ИеЬКейиевГ.Сгеаге(иггвсг)т игавгг = пи11т // запретить дальнейшее использование этого ОК1 // Отправить сформированный запрос и получить на него ответ. НссриеЬКевропве гевр (НГГРИеЬКевропве) гей.бесневропве(); // Получить поток ввода из принятого ответа. яггеаш 1всгш = гевр.оегкевропвезсгеаш()т // Заключить поток ввода в оболочку класса ЯсгеашКеабег.
Бкгеашйеайег гбг = пен Бкгеаюнеадег(гвсгш)т // Прочитать всю страницу. всг " гбг.неабтоЕпб()т сиг1ос О) бо ( // Найти следующий ОК1 для перехода по ссылке. 11пл = Р1пб11пл(вкг, гег сиг1ос)т гг(11пл != пи11) ( сопво1е.игаге11пе("найдена ссылка: " +11пк); Сопво1е.Итаке( "Перейти по ссылке, Искать дальше, Выйти?" ) апвнег = Сопво1е.КеабЕапе() 11(всг1пО.Сошраге(апвнег, "П", Ггие) == О) ( иггвгг = всг1пО.Сору(11пи)) Ьгеаит ) е1ве 11( всг1пО.Сошраге(апвнег, "В", Ггие) == О) ( Ьгеалт ) е1ве 11( вогана.Сошраге (апянег, "И", Ггие) = О) ( Сопво1е.игагетапе("поиск следующей ссылки."); ) ) е1ве ( Сопяо1е.нгасеПТпе("Больше ссылок не найдено."); Ьгеааы ) нЬ11е(11па.Еепдсп > 0) т Глава 25.
Сетевые средства подключения к Интернету 937 // Закрыть ответный поток. тевр.С1озе(); ) чн11е(иттзтт != пи11)? ) сассЬ(неЬЕхсертгоп ехс) ( Сопзо1е.нт1Се11пе("Сетевал ошибка: ехс.меззаде + "1пкод состояния: " + ехс.зсаспв); ) сассь(ртотосо1усо1атгопЕхсерт1оп ехс) ( Сопзо1е.нт1Се11пе("Протокольнав ошибка: " + ехс.Меззаде); ) сатен(птсготшаСЕхсерС1оп ехс) ( Сопво1е.итгсеььпе("Ошибка формата Он1: " + ехс.Меззаде); ) сатсЬ(нотзпрроттебЕхсерттоп ехс) ( Сопво1е.итгсеьгпе("неизвестный протокол: " + ехс.Меззаде); ) сатсЬ(1ОЕхсерСтоп ехс) ( сопво1е.иттсеьапе("Ошибка ввода-вывода: " + ехс.Мевзаде); ) Сопзоте.Итгседвпе ("Завершение программы М1птстач1ет. ") к ) ) Ниже приведен пример сеанса поиска, начиная с адреса ччч.
Мсптач-Н111. сош. Следует иметь в виду, что конкретный результат поиска зависит от состояния содержимого на момент поиска. Переход по ссылке ЬССр://шсдтач-Ь111.сош Найдена ссылка: ЬССр://втт.шсдтач-Ьт11.сош:9000/сдг-Ьыд/ диету?шзв зеатсььрд ад Перейти по ссылке, Искать дальше, Выйти? и Пои~к следупшвй ссылки. найдена ссылка: ьссрк//1пчезсот.шсдтач-ь111.сош/рьоеп1х.ььсш1?с=96562ьр=уто1- ттЬоше Перейти по ссылке, Искать дальше, Выйти? П Переход по ссылке ЬССр://гпчезтот.шсдтач-ЬШ .сош/рьоепгх. зьсш1?с=96562ьр=гто1-гтьоше найдена ссылка: ьсср:Оччч.шсдтач-ь111.сош/1пбех.ьсш1 Перейти о ссылке, Искать дальше, Выйти? П Переход по ссылке Ьсср://ччч.шсдтач-ЬШ .сош/1пбех.ьтш1 Найдена ссылка: Ьсср://втс.шсдтач-Ь111.сош:9000/сдс-Ь1п/ диету?шьз=ьеатсЬьрд=ад Перейти по ссылке, Искать дальше, Вьзлти? В Завершение программы мгпгСтач1ет. Рассмотрим подробнее работу программы М(п(Сгаъ 1ег.
Она начинается с ввода пользователем конкретного 1)К! в командной строке. В методе масп () этот 1)К! сохраняется в строковой переменной птьзст, Затем по указанному УК1 формируется запрос, и переменной иттзст присваивается пустое значение, указывающее на то, что данный 1)К! уже использован. Далее отправляется запрос и получается ответ. После этого содержимое читается из потока ввода, возвращаемого методом песпезропзеЗстеаш () и заключаемого в оболочку класса Зстеашнеас(ет.