Загрузка...

Каналы связи. Использование классов пространства System. Net.


Практическое занятие № 8

Тема: «Каналы связи. Использование классов пространства System. Net.»

Каналы

Канал используется для коммуникации между клиентом .NET и сервером. Среда .NET поставляется с классами каналов, которые общаются с помощью TCP или HTTP. Можно создать специальные каналы для других протоколов.

Канал HTTP применяется большинством служб Web. Он использует для коммуникации протокол HTTP, так как брандмауэры обычно имеют открытым порт 80, чтобы клиенты могли получить доступ к серверам и службам Web. Прием на порту 80 также находится в распоряжении этих клиентов.

В Интернете используется и канал TCP, но здесь брандмауэры должны специально конфигурироваться, чтобы клиенты получали доступ к указанному порту канала TCP. Канал TCP по сравнению с HTTP может применяется для коммуникации более эффективно в интранет.

Когда выполняется вызов метода на удаленном объекте, объект клиентского канала посылает сообщение удаленному объекту канала.

Как серверное, так и клиентское приложения, должны создавать канал.

Следующий код показывает, как можно создать TcpServerChannel на серверной стороне:

using   System;Runtime.Remoting.Channels .Тср;

//..                                                                                                                        :

TcpServerChanael   channel   = new   TcpServerChannel(8086);•

Порт, который слушает сокет TCP, определяется аргументом конструктора. Серверный канал должен определить общеизвестный порт, а клиент использует его порт при доступе к серверу. Однако для создания TcpClientChannel на клиенте не требуется определять общеизвестный порт. Конструктор по умолчанию для TcpClient Channel выберет доступный порт, который передается серверу во время соединения, чтобы сервер мог послать данные назад клиенту.

Создание нового экземпляра канала немедленно включает сокет на прослушивание состояния, которое можно проверить, вводя в командной строке netstat   -a.

Каналы HTTP используются аналогично каналам TCP. Определяется порт, где сервер может создать слушающий сокет. У нас также есть конструктор, в котором можно задать, передавая Boolean, что должен использоваться защищенный протокол HTTP.

Сервер способен слушать несколько каналов. Здесь создаются каналы как HTTP, так и TCP:

Для применения класса TcpServerChannel необходимо сослаться на сборку System.Runtime.Remoting. dll, для этого выбрать Add Reference, в появившемся окне из списка выбрать пункт System.Runtime.Remoting.

Add_Reference

Создание нового экземпляра канала немедленно включает сокет на прослушивание состояния, которое можно проверить, вводя в командной строке netstat   -a.

Задание 1: реализуйте пример в консольном приложении. Запустите команду

netstat   -a, затем запустите приложение и еще раз запустите команду netstat   -a. Вы должны увидеть в списке, порты которые были созданы в приложении и установленные в состояние прослушивания.

Класс канала должен реализовать интерфейс ichannel. Интерфейс ichannel имеет два свойства:

  • ChanneliName — только для чтения, которое возвращает имя канала. Имя канал зависит от типа, например, канал HTTP называется HTTP.
  • Channel Priority — только для чтения с условием, что более одного канала используется для коммуникации между клиентом и сервером. Приоритет определяет порядок каналов. На клиенте канал с более высоким приоритетом выбирается первым для соединения с сервером.

В зависимости от того, является ли канал клиентским каналом или серверным каналом, реализуются дополнительные интерфейсы. Серверные версии каналов реализуют интерфейс IChannelReceiver, клиентские версии — интерфейс IChannelSender.   ‘

Классы HttpChannel и TcpChannel используются как для клиентов, так и для серверов. Они реализуют IChannelSender и IChannelReceiver. Эти интерфейсы являются производными из IChannel.

IChannelSender клиентской стороны имеет в дополнение в IChannel единственный метод, называемый CreateMessageSink(), который возвращает объект, реализующий  IMessageSink. Интерфейс IMessageSink применяется для размещения синхронных, а также асинхронных сообщений в канале. С помощью интерфейса серверной стороны  IChannelReceiver канал можно перевести в режим прослушивания с помощью метода StartListening () и снова остановить с помощью метода StopListening(). Также имеется свойство для доступа к полученным данным.

Информацию о конфигурации обоих каналов получают с помощью свойств классов каналов ChannelName, ChannelPriority и ChannelData. С помощью свойства ChannelDataS получают информацию об URI, который хранится в классе ChannelDataStore. В классе  HttpChannel имеется также свойство Scheme. Метод ShowChannelProp(), демонстрирует эти данные.

Служебный класс ChannelServices используется для регистрации каналов в среде выполнения .NET Remoting. С помощью этого класса можно также получить доступ ко всем зарегистрированным каналам. Канал регистрируется с помощью статического метода ChannelServices.RegisterChannel().

Свойство RegisteredChannels возвращает массив IChannel всех зарегистрированных каналов. Возможно также использование метода GetChannel () для доступа к определенному каналу по его имени. С помощью ChannelServices пишется специальная административная утилита для управления каналами. Вот небольшой пример, показывающий как можно остановить режим прослушивания канала:

HttpServerChannel channel = (HttpServerChannel) ChannelServices.GetChannel(“http”);

channel.StopListening(null);

 

Задание 2: Создайте Windows – приложение, в котором по нажатию на кнопку останавливается прослушивание канала Http. Вывод свойств каналов выводиться в любой объект формы. Значение приоритета устанавливается в текстовом поле.

Использование классов пространства System. Net.

Пространство имен System.Net содержит сетевые классы для поиска IP – адресов, сетевой аутентификации, разрешений, отправки и получения данных.

Для соединения с сервером нужен IP – адрес сервера. Поскольку IP – адреса запомнить непросто и они могут изменяться, используют имена DNS и о том, как сервер DNS выполняет разрешение имен в IP – адреса. В приложениях платформы .Net для разрешения доменных имен можно использовать класс Dns.

            Задание 3: Получить IP – адрес для имени хоста.

Для этого можно воспользоваться статическим методом Dns. Resolve(). Так как для имени хоста может быть сконфигурировано несколько IP-адресов, то метод Resolve() возвращает не только IPAdress, но и объект IPHostEntry, который содержит массив адресов, альтернативные имена и само имя хоста.

В следующем примере с помощью метода Dns. Resolve() получаем IP- адреса для имени хоста www.microsoft.com . Используя свойство AddressList, которое возвращает массив объектов IPAddress, выводим IP-адреса на консоль Затем, обращаясь к свойству Aliases, выполним цикл по всем зарегистрированным именам и наконец выводим на консоль настоящее имя хоста.

Add Reference

IP-System-Net

В классе Dns  есть и другие статические методы, возвращающие объекты IPHostEntry. Они различаются главным образом способом передачи имени хоста:

Resolve() Принимает DNS – имя хоста или IP –адрес в десятичной нотации с точками для разрешения IP – адресов
GetHostByName() Принимает только DNS имя хоста, но не IP адрес
GetHostByAddress () Возвращает объект IPHostEntry, передавая или IP-адрес в виде строки в десятичной нотации с точками, или объект IPAddress

Чтобы получить имя хоста локального компьютера, используем метод Dns.GetHostName().

 

Задание 4 : выполнить разрешение имени хоста.

Асинхронное разрешение IP – адреса.

Опрос сервера DNS может занять некоторое время. В классе Dns  есть встроенная поддержка асинхронного поиска DNS, например асинхронная версия метода GetHostByName() называется BeginGetHostByName() и  EndGetHostByName(). Метод BeginGetHostByName() начинает опрос имени, но не ждет успешного завершения обработки запроса или завершения по тайм-ауту – он возвращает управление немедленно. Кроме имени хоста этот метод принимает делегата AsyncCallback, определяющего, какой метод следует вызвать, если имя хоста будет разрешено или истечет интервал тайм – аута.

В примере используется метод на уровне класса DnsLookupCompleted, имеющий тот же тип возврата и сигнатуру, как они определены делегатом AsyncCallback.

AsyncCallback

Как только поиск DNS завершен, вызывается метод DnsLookupCompleted(), и получается результат поиска методом Dns.EndGetHostByName(). Затем идет обращение ко всем IP – адресам, как в предыдущем синхронном примере:

обращение ко всем IP

После того как было выполнено разрешение имени хоста, клиент и сервер могут начать обмен информацией. Сервер создает сокет и ожидает (слушает) входящие запросы клиентов. Клиент соединяется с сервером, и затем клиент с сервером могут отправлять и получать данные.

Загрузка...