Compartilhar via


Serviço: ouvintes de canal e canais

Há três categorias de objetos de canal: canais, escutadores de canal e fábricas de canais. Canais são a interface entre o aplicativo e a pilha de canais. Os ouvintes de canais são responsáveis por criar canais no lado de recebimento (ou escuta), normalmente em resposta a uma nova mensagem ou conexão de entrada. As fábricas de canais são responsáveis por criar canais no lado de envio para iniciar a comunicação com um ponto de extremidade.

Canais e ouvintes de canais

Os ouvintes de canal são responsáveis por criar canais e receber mensagens da camada abaixo ou da rede. As mensagens recebidas são entregues à camada acima usando um canal criado pelo ouvinte do canal.

O diagrama a seguir ilustra o processo de recebimento de mensagens e entrega para a camada acima.

Canais e ouvintes de canais

Um ouvinte de canal que recebe mensagens e as entrega à camada superior através de canais.

O processo pode ser modelado conceitualmente como uma fila dentro de cada canal, embora a implementação não possa realmente usar uma fila. O ouvinte de canal é responsável por receber mensagens da camada abaixo ou da rede e colocá-las na fila. O canal é responsável por obter mensagens da fila e entregá-las à camada acima quando essa camada solicita uma mensagem, por exemplo, chamando Receive no canal.

O WCF fornece auxiliares de classe base para esse processo. Para obter um diagrama das classes auxiliares do canal discutidas neste artigo, consulte a Visão geral do modelo de canal.

A discussão a seguir baseia-se no exemplo transporte: UDP .

Criando um ouvinte de canal

O UdpChannelListener que o exemplo implementa deriva da ChannelListenerBase classe. Ele usa um único soquete UDP para receber datagramas. O OnOpen método recebe dados usando o soquete UDP em um loop assíncrono. Em seguida, os dados são convertidos em mensagens usando o sistema de codificação de mensagens:

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

Como o mesmo canal de datagrama representa mensagens que chegam de várias fontes, o UdpChannelListener é um ouvinte singleton. Há, no máximo, um IChannel ativo associado a esse ouvinte por vez. O exemplo gerará outro somente se um canal retornado pelo AcceptChannel método for descartado posteriormente. Quando uma mensagem é recebida, ela é enfileirada neste canal singleton.

UdpInputChannel

A UdpInputChannel classe implementa IInputChannel. Consiste em uma fila de mensagens de entrada que é preenchida pelo soquete UdpChannelListener. Essas mensagens são removidas da fila pelo método Receive.