Servicio: Canales y escucha de canales
Hay tres categorías de objetos de canal: canales, escuchas de canales y generadores de canales. Los canales son la interfaz entre la aplicación y la pila de canales. Las escuchas de canales son responsables de crear los canales en el lado de recepción (o escucha), normalmente en respuesta a un nuevo mensaje entrante o conexión. Los generadores de canales son responsables de crear los canales en el lado de envío para iniciar la comunicación con un extremo.
Escuchas de canales y canales
Las escuchas de canales son responsables de crear los canales y recibir los mensajes del nivel inferior o de la red. Los mensajes recibidos se entregan al nivel superior utilizando un canal creado por la escucha de canales.
El diagrama siguiente muestra el proceso de recibir mensajes y entregarlos al nivel superior.
Una escucha de canales recibiendo mensajes y entregándolos al nivel superior a través de canales.
El proceso se puede modelar conceptualmente como una cola, aunque dentro de cada canal la implementación puede no utilizar una cola. La escucha de canales es responsable de recibir los mensajes del nivel inferior o de la red y colocarlos en la cola. El canal es responsable de recibir los mensajes de la cola y entregarlos al nivel superior cuando dicho nivel pide un mensaje, por ejemplo llamando a Receive
en el canal.
WCF proporciona los asistentes de clase base para este proceso. (Para un diagrama de las clases auxiliares de canal que se describen en este artículo, consulte Introducción al modelo de canales).
La clase CommunicationObject implementa ICommunicationObject y exige la máquina de estados descrita en el paso 2 de Desarrollo de canales.
La clase ChannelManagerBase implementa CommunicationObject y proporciona una clase base unificada para ChannelFactoryBase y ChannelListenerBase. La clase ChannelManagerBase trabaja junto con ChannelBase, que es una clase base que implementa IChannel.
La clase ChannelFactoryBase implementa ChannelManagerBase y IChannelFactory, y consolida las sobrecargas de
CreateChannel
en un método abstractoOnCreateChannel
.La clase ChannelListenerBase implementa IChannelListener. Se encarga de la administración de estados básica.
La siguiente explicación se basa en el ejemplo Transport: UDP.
Creación de una escucha de canales
El UdpChannelListener
que el ejemplo implementa se deriva de la clase ChannelListenerBase. Utiliza un socket UDP único para recibir datagramas. El método OnOpen
recibe datos utilizando el socket UDP en un bucle asincrónico. Los datos se convierten en mensajes utilizando el sistema de la codificación de mensajes:
message = UdpConstants.MessageEncoder.ReadMessage(
new ArraySegment<byte>(buffer, 0, count),
bufferManager
);
Dado que el mismo canal del datagrama representa mensajes que llegan de varios orígenes, UdpChannelListener
es un agente de escucha singleton. Hay, a lo sumo, un IChannel activo asociado a la vez a este agente de escucha. El ejemplo solo genera otro si se elimina subsiguientemente un canal que es devuelto por el método AcceptChannel. Cuando se recibe un mensaje, se pone en cola en este canal singleton.
UdpInputChannel
La clase UdpInputChannel
implementa IInputChannel. Está compuesto de una cola de mensajes entrantes que es rellenada por el socket UdpChannelListener
. Estos mensajes se quitan de la cola mediante el método Receive.