Поделиться через


Служба: прослушиватели каналов и каналы

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

Прослушиватели каналов и каналы

Прослушиватели каналов отвечают за создание каналов и прием сообщений с более низкого уровня или из сети. Принятые сообщения доставляются на уровень выше с помощью канала, созданного прослушивателем каналов.

Следующая схема показывает процесс приема сообщения и доставки его на уровень выше.

Прослушиватели каналов и каналы

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

В WCF предусмотрены вспомогательные базовые классы для этого процесса. (Схему обсуждаемых здесь вспомогательных классов каналов см. в разделе Общие сведения о модели каналов.)

  • Класс CommunicationObject реализует интерфейс ICommunicationObject и принудительно создает конечный автомат, описанный в пункте 2 раздела Разработка каналов.

  • Класс ChannelManagerBase реализует объект CommunicationObject и предоставляет универсальный базовый класс для ChannelFactoryBase и ChannelListenerBase. Класс ChannelManagerBase работает совместно с классом ChannelBase — базовым классом, реализующим интерфейс IChannel.

  • Класс ChannelFactoryBase реализует класс ChannelManagerBase и интерфейс IChannelFactory и объединяет перегрузки CreateChannel в один абстрактный метод OnCreateChannel.

  • Класс ChannelListenerBase реализует интерфейс IChannelListener. Он отвечает за базовое управление состоянием.

Дальнейшее обсуждение основано на примере Транспорт: UDP.

Создание прослушивателя каналов

Класс UdpChannelListener, реализованный в образце, унаследован от класса ChannelListenerBase. Он использует один UDP-сокет для приема датаграмм. Метод OnOpen принимает данные через UDP-сокет в асинхронном цикле. Затем данные преобразуются в сообщения с помощью системы кодирования:

message = UdpConstants.MessageEncoder.ReadMessage(
  new ArraySegment<byte>(buffer, 0, count), 
  bufferManager
);

Поскольку один канал датаграмм представляет сообщения, приходящие из нескольких источников, UdpChannelListener — одноэлементный прослушиватель. С этим прослушивателем в каждый момент времени может быть связано не более одного активного интерфейса IChannel . В примере создается новый экземпляр только в том случае, если канал, возвращенный методом AcceptChannel, был впоследствии освобожден. Когда сообщение принято, оно ставится в очередь в этот одноэлементный канал.

UdpInputChannel

Класс UdpInputChannel реализует интерфейс IInputChannel. Он состоит из очереди входящих сообщений, которая заполняется сокетом прослушивателя UdpChannelListener. Эти сообщения удаляются из очереди с помощью метода Receive.