服务:通道侦听器和通道
共有三种类别的通道对象:通道、通道侦听器和通道工厂。 通道是应用程序和通道堆栈之间的接口。 通道侦听器负责在接收(即侦听)端创建通道,这通常是为了响应新传入的消息或连接。 通道工厂负责在发送端创建通道,以便启动与终结点的通信。
通道侦听器和通道
通道侦听器负责创建通道并从下面的层或者从网络接收消息。 收到的消息将借助于通道侦听器所创建的通道传送到上面的层中。
下面的关系图阐释了接收消息并将其传送到上面的层的过程。
通道侦听器接收消息并借助于通道将收到的消息传送到上面的层。
该过程在概念上可建模为每个通道中的一个队列,尽管在具体实现中可能并不实际使用队列。 通道侦听器负责从下面的层或者从网络接收消息,并将收到的消息放入队列。 通道负责从队列中获取消息,并在上面的层请求消息(例如通过对通道调用 Receive
)时将收到的消息传送到该层。
WCF 为此过程提供基类帮助程序。 有关本文中讨论的通道帮助程序类的关系图,请参阅通道模型概述。
CommunicationObject 类实现 ICommunicationObject 并强制执行开发通道的步骤 2 中所述的状态机。
ChannelManagerBase 类实现 CommunicationObject 并为 ChannelFactoryBase 和 ChannelListenerBase 提供统一的基类。 ChannelManagerBase 类与 ChannelBase(用来实现 IChannel 的基类)结合使用。
ChannelFactoryBase 类实现 ChannelManagerBase 和 IChannelFactory,并将
CreateChannel
重载合并到一个OnCreateChannel
抽象方法中。ChannelListenerBase 类实现 IChannelListener。 它负责执行基本状态管理。
以下讨论基于传输: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 方法取消排队。