Служба: прослушиватели каналов и каналы
Есть три категории объектов каналов: каналы, прослушиватели каналов и фабрики каналов. Каналы — это интерфейс между приложением и стеком канала. Прослушиватели каналов отвечают за создание каналов на принимающей (ожидающей передачи данных) стороне, обычно в ответ на новое входящее сообщение или подключение. Фабрики каналов отвечают за создание каналов на передающей стороне для инициации связи с конечной точкой.
Прослушиватели каналов и каналы
Прослушиватели каналов отвечают за создание каналов и прием сообщений с более низкого уровня или из сети. Принятые сообщения доставляются на уровень выше с помощью канала, созданного прослушивателем каналов.
Следующая схема показывает процесс приема сообщения и доставки его на уровень выше.
Процесс можно концептуально представить в виде очереди внутри каждого канала, хотя реализация может не использовать очередь. Прослушиватель канала отвечает за прием сообщений с более низкого уровня или из сети и добавление их в очередь. Канал отвечает за получение сообщений из очереди и передачу их на уровень выше, откуда приходит запрос на сообщение, например вызовом команды Receive для данного канала.
В WCF предусмотрены вспомогательные базовые классы для этого процесса. (Схему обсуждаемых здесь вспомогательных классов каналов см. в разделе Общие сведения о модели каналов.)
Класс CommunicationObject реализует интерфейс ICommunicationObject и принудительно создает конечный автомат, описанный в пункте 2 раздела Разработка каналов.
Класс ChannelManagerBase реализует объект CommunicationObject и предоставляет универсальный базовый класс для ChannelFactoryBase и ChannelListenerBase. Класс ChannelManagerBase работает совместно с классом ChannelBase — базовым классом, реализующим интерфейс IChannel.
Класс
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.