服务:通道侦听器和通道

共有三种类别的通道对象:通道、通道侦听器和通道工厂。 通道是应用程序和通道堆栈之间的接口。 通道侦听器负责在接收(即侦听)端创建通道,这通常是为了响应新传入的消息或连接。 通道工厂负责在发送端创建通道,以便启动与终结点的通信。

通道侦听器和通道

通道侦听器负责创建通道并从下面的层或者从网络接收消息。 收到的消息将借助于通道侦听器所创建的通道传送到上面的层中。

下面的关系图阐释了接收消息并将其传送到上面的层的过程。

Channel listeners and channels

通道侦听器接收消息并借助于通道将收到的消息传送到上面的层。

该过程在概念上可建模为每个通道中的一个队列,尽管在具体实现中可能并不实际使用队列。 通道侦听器负责从下面的层或者从网络接收消息,并将收到的消息放入队列。 通道负责从队列中获取消息,并在上面的层请求消息(例如通过对通道调用 Receive)时将收到的消息传送到该层。

WCF 为此过程提供基类帮助程序。 有关本文中讨论的通道帮助程序类的关系图,请参阅通道模型概述

以下讨论基于传输: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 方法取消排队。