Serviço: ouvintes de canal e canais
Há três categorias de objetos de canal: canais, ouvintes de canais 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.
Ouvintes de canal e canais
Os ouvintes de canais 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 de canais.
O diagrama a seguir ilustra o processo de recebimento de mensagens e entrega para a camada acima.
Um ouvinte de canais recebendo mensagens e entregando para a camada acima por meio de canais.
O processo pode ser modelado conceitualmente como uma fila dentro de cada canal, embora a implementação possa não usar uma fila. O ouvinte de canais é 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, ao chamar Receive
no canal.
O WCF fornece auxiliares de classe base para esse processo. Para ver um diagrama das classes auxiliares de canal discutidas neste artigo, confira Visão geral do modelo de canal.
A classe CommunicationObject implementa ICommunicationObject e impõe a máquina de estado descrita na etapa 2 de Desenvolvendo canais.
A classe ChannelManagerBase implementa o CommunicationObject e fornece uma classe base unificada para ChannelFactoryBase e ChannelListenerBase. A classe ChannelManagerBase funciona em conjunto com a ChannelBase, que é uma classe base que implementa IChannel.
A classe ChannelFactoryBase implementa ChannelManagerBase e IChannelFactory e consolida as sobrecargas de
CreateChannel
em um método abstratoOnCreateChannel
.A classe ChannelListenerBase implementa IChannelListener. Ela cuida do gerenciamento básico do estado.
A discussão a seguir baseia-se na amostra Transporte: UDP.
Criar um ouvinte de canais
O UdpChannelListener
que a amostra implementa deriva da classe ChannelListenerBase. Ele usa um único soquete UDP para receber datagramas. O método OnOpen
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. A amostra somente gerará outra, se um canal retornado pelo métodoAcceptChannel for descartado posteriormente. Quando uma mensagem é recebida, ela é enfileirada neste canal singleton.
UdpInputChannel
A classe UdpInputChannel
implementa o IInputChannel. Ele consiste em uma fila de mensagens de entrada que é propagada pelo soquete do UdpChannelListener
. Essas mensagens são removidas da fila pelo método Receive.