Partager via


Service : écouteurs de canal et canaux

Il existe trois catégories d'objets de canal : les canaux, les écouteurs de canal et les fabrications de canaux. Les canaux sont l'interface entre l'application et la pile de canaux. Les écouteurs de canal sont chargés de créer des canaux du côté réception (ou écoute), généralement en réponse à une nouvelle connexion ou un nouveau message entrant. Les fabrications de canaux sont chargées de créer des canaux du côté envoi afin d'initier la communication avec un point de terminaison.

Écouteurs de canal et canaux

Les écouteurs de canal sont chargés de créer des canaux et de recevoir les messages de la couche inférieure ou du réseau. Les messages reçus sont remis à la couche supérieure à l'aide d'un canal créé par l'écouteur de canal.

Le diagramme suivant illustre le processus de réception des messages et de leur remise à la couche supérieure.

Écouteurs de canal et canaux

Le processus peut être modelé conceptuellement comme une file d'attente à l'intérieur de chaque canal, bien que l'implémentation n'utilise pas obligatoirement de file d'attente. L'écouteur de canal est chargé de recevoir les messages de la couche inférieure ou du réseau et de les mettre dans la file d'attente. Le canal est chargé d'obtenir des messages de la file d'attente et de les transmettre à la couche supérieure lorsque celle-ci demande un message, par exemple en appelant Receive sur le canal.

WCF fournit des assistants de classe de base pour ce processus. (Pour obtenir un diagramme des classes d'assistance de canal mentionnées dans cette rubrique, consultez Vue d'ensemble du modèle de canal.)

La discussion qui suit s'appuie sur l'exemple Transport: UDP.

Création d'un écouteur de canal

L'élément UdpChannelListener implémenté par l'exemple dérive de la classe ChannelListenerBase. Il utilise un socket UDP unique pour recevoir des datagrammes. La méthode OnOpen reçoit des données à l'aide du socket UDP dans une boucle asynchrone. Les données sont ensuite converties en messages à l'aide du système d'encodage de message :

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

Étant donné que le même canal de datagramme représente des messages qui arrivent de plusieurs sources, l'UdpChannelListener est un écouteur Singleton. Il y a, au plus, un objet IChannel actif associé à cet écouteur à la fois. L'exemple en génère un autre uniquement si un canal retourné par la méthode AcceptChannel est disposé par la suite. Lorsqu'un message est reçu, il est mis en file d'attente dans ce canal singleton.

UdpInputChannel

La classe UdpInputChannel implémente IInputChannel. Elle se compose d'une file d'attente de messages entrants remplie par le socket de UdpChannelListener. Ces messages sont extraits de la file d'attente par la méthode Receive.