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


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

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

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

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

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

Channel listeners and channels

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

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

WCF предоставляет вспомогательные средства базового класса для этого процесса. Схема вспомогательных классов канала, рассмотренных в этой статье, см . в разделе "Обзор модели канала".

Следующее обсуждение основано на примере транспорта: 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 .