KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Симон Робинсон - C# для профессионалов. Том II

Симон Робинсон - C# для профессионалов. Том II

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Симон Робинсон, "C# для профессионалов. Том II" бесплатно, без регистрации.
Перейти на страницу:

Служебные классы

В этом разделе будет представлена пара служебных классов, которые могут облегчить программирование Web при работе с двумя распространенными темами Интернета — URI и адреса IP.

URI

Uri и UriBuilder являются двумя классами в пространстве имен System (подчеркнем, что не System.Net) и оба предназначены для представления Uri. Различие между ними состоит в том, что UriBuilder создает URI по заданным строкам для его компонентов, в то время как Uri выполняет синтаксический разбор всего URI.

Поскольку класс Uri предназначен скорее для разбиения, а не для создания Uri, он требует полной строки URI, чтобы ее создать.

Uri MSPage =

 new Uri("http://www.Microsoft.com/SomeFolder/SomeFile.htm?Order=- true");

Класс представляет большое число свойств, которые предназначены только для чтения. В объекте Uri не предусмотрены изменения после того, как он был создан.

string Query = MSPage.Query;               // Order = true

string AbsolutePath = MSPage.AbsolutePath; // SomeFolder/SomeFile.htm

string Schema = MSPage.Schema;             // http

int Port = MSPage.Port;                    // 80 (по умолчанию для http)

string AbsolutePath = MSPage.AbsolutePath; // SomeFolder/SomeFile.htm

string Host = MSPage.Host;                 // www.Microsoft.com

bool IsDefaultPort = MSPage.IsDefaultPort; // true, так как

                                           // 80 — значение по умолчанию

UriBuilder, с другой стороны, реализует меньше свойств: лишь столько, чтобы построить полный URI. Однако эти свойства предназначены для чтения-записи. Можно задать компоненты для создания URI с помощью конструктора:

Uri MSPage =

 new UriBuilder("http", "www.Microsoft.com", 80,

 "SomeFolder/SomeFile.htm", "Order=true");

Или присвоить значения свойствам.

UriBuilder MSPage = new UriBuilder();

MSPage.Schema = "http";

MSPage.Host = "www.Microsoft.com";

MSPage.Port = 80;

MSPage.Path = "SomeFolder/SomeFile.htm";

MSPage.Query = "Order=true";

После завершения инициализации UriBuilder получается соответствующий объект Uri со свойством Uri.

Uri CompletedUri = MSPage.Uri;

Пример вывода страницы

Мы проиллюстрируем использование UriBuilder вместе с созданием процесса Internet Explorer на примере DisplayPage. Этот пример позволяет пользователю ввести компоненты URL. Отметим, что имеется в виду URL, а не URI, так как предполагается, что это запрос HTTP. Пользователь сможет затем щелкнуть на кнопке ViewPage, и приложение выведет весь URL в текстовом поле, а также страницу с помощью элемента управления ActiveX WebBrowser.

Этот пример, будучи стандартным приложением Windows на C#, выглядит так:

Текстовые поля названы соответственно textBoxServer, textBoxPath, textBoxPort и textBoxURI. Добавленный код примера полностью находится в обработчике событий кнопки ViewPage:

private void OnClickViewPage(object sender, System.EventArgs e) {

 UriBuilder Address = new UriBuilder();

 Address.Host = textBoxServer.Text;

 Address.Port = int.Parse(textBoxPort.Text);

 Address.Scheme = Uri.UriSchemeHttp;

 Address.Path = textBoxFile.Text;

 Uri AddressUri = Address.Uri;

 Process myProcess = new Process();

 myProcess.StartInfo.FileName = "iexplorer.exe";

 textBoxURI.Text = AddressUri.ToString();

 myProcess.StartInfo.Arguments = AddressUri.ToString();

 myProcess.Start();

}

Адреса IP и имена DNS

Серверы в Интернете, так же, как и клиенты, идентифицируются адресами IP или по именам хостов (называемых также именами DNS). Обычно имя хоста, такое как www.wrox.com или www.microsoft.com, является понятным для пользователя и вводится в окне браузера Web. Адрес IP, с другой стороны, является идентификатором, который компьютеры используют для идентификации друг друга, и реально используется для обеспечения того, чтобы запросы и ответы Web направлялись на соответствующие машины.

Адрес IP является просто 32-битовым целым числом, которое обычно представляют в так называемом десятичном формате с точками как набор из четырех чисел — каждое между 0 и 255. Компьютер может иметь даже более одного адреса IP. Например, IP 100.100.100.31 при общении с другими компьютерами в Интернете через модем и адрес 10.0.0.1 при общении через свою сетевую карту с другими компьютерами в локальной сети. Следовательно, если другие компьютеры в локальной сети хотят послать сообщение этому компьютеру, они должны обращаться по адресу 10.0.0.1, в то время как компьютеры в Интернете должны обращаться к нему по адресу 100.100.100.31. Адреса обычно динамически присваиваются компьютеру каждый раз либо при загрузке (для компьютеров с постоянным соединением с интранет), либо при установлении связи (для компьютеров, соединенных с провайдером Интернета через модем или аналогичное устройство). Динамически присваиваемые адреса IP передаются компьютеру по мере необходимости из пула адресов, поддерживаемых его провайдером Интернета.

Люди редко вводят адреса IP непосредственно, а используют более понятные имена DNS, такие как www.wrox.com. Поэтому необходимо при отправке сетевого запроса сначала транслировать имя DNS в адрес IP, что выполняет один из нескольких серверов DNS.

Это организовано следующим образом: некая машина, соединенная с локальным компьютером (что означает либо выделенную машину в локальной сети, либо при модемном соединении машину в корпоративной сети, с которой происходит соединение), будет определена сервером DNS. Эта машина хранит огромную таблицу, отображающую имена DNS в адреса IP для всех известных ему компьютеров, и также содержит адреса IP других серверов DNS, имеющие возможность найти адреса, о которых она не знает. Каждый сетевой компьютер должен знать адрес IP по крайней мере одного локального сервера DNS (это один из элементов данных, которые необходимо предоставить при настройке сетевой конфигурации на компьютере). Когда посылается запрос, компьютер сначала запрашивает сервер DNS, чтобы он сообщил адрес IP, соответствующий введенному адресу домена. Затем, с помощью правильного адреса IP, направляется запрос. Обычно это происходит неявно и поэтому прозрачно, например при перемещении в Интернете.

Классы .NET для адресов IP

.NET предоставляет ряд классов, которые могут помочь в процессе поиска адресов IP и при получении информации о компьютерах-хостах.

IPAddress

Класс IPAddress представляет адрес IP, который доступен как свойство Address и может быть преобразован в десятичный формат с точками с помощью ToString(). IPAddress реализует также статический метод Parse(), эффективно выполняя обратное преобразование в ToString() — из десятичной строки с точками в (целочисленный) адрес IP.

IPAddress ipAddress = IPAddress.Parse("234.56.78.9");

int address = ipAddress.Address;        // address будет присвоено 37105130

string ipString = ipAddress.ToString(); // ipString будет присвоен

                                        // текст "234.45.54.2"

IPAddress предоставляет также ряд константных статических полей, которые возвращают известные специальные адреса IP, имеющие специальные значения.

//следующая строка задает обратную петлю как "127.0.0.1"

// адрес обратной петли указывает локальный хост

string loopback = IPAddress.Loopback.ToString();

// следующая строка задает адрес широковещания как "255.255.255.255"

// адрес широковещания используется для отправки сообщения

// всем машинам в локальной сети

String broadcast = IPAddress.Broadcast.ToString();

IPHostEntry

Класс IPHostEntry инкапсулирует информацию, связанную с определенным хостом (компьютером). Он делает доступным имя хоста с помощью свойства HostName (которое возвращает строку) и все адреса IP с помощью свойства AddressList, которое возвращает массив объектов IPAddress. Класс IPHostEntry будет показан в действии в примере DNSResolver ниже.

DNS

Класс DNS является классом, который может общаться с используемым по умолчанию сервером DNS, чтобы извлечь адреса IP. Двумя важными (статическими) методами здесь являются Resolve(), использующий сервер DNS для получения данных хоста с заданным именем хоста, и GetHostByAddress(), который также посылает назад эти данные, но в этот раз с помощью адреса. Оба метода возвращают объект IPHostEntry.

HostEntry wroxHost = Dns.Resolve("www.microsoft.com");

HostEntry wroxHostCopy = Dns.GetHostByAddress("234.234.234.234");

В этом коде оба объекта HostEntry будут содержать данные серверов Microsoft.com.

Класс Dns отличается от классов IPAddress и IPHostEntry тем, что инкапсулирует возможность реально общаться с серверами для получения информации. Классы IPAddress и IPHostEntry, напротив, мало чем отличаются от структур данных, которые имеют подходящие свойства, позволяющие получить доступ к содержащимся в них данным.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*