次の方法で共有


サービス : チャネル リスナーとチャネル

チャネル オブジェクトには、チャネル、チャネル リスナー、およびチャネル ファクトリという 3 つのカテゴリがあります。チャネルはアプリケーションおよびチャネル スタックとのインターフェイスです。チャネル リスナーは受信 (またはリッスン) する側のチャネルを作成する役割を果たします。通常は、新しい受信メッセージまたは接続への応答を行います。チャネル ファクトリは送信側のチャネルを作成し、エンドポイントとの通信を開始する役割を果たします。

チャネル リスナーとチャネル

チャネル リスナーには、チャネルを作成し、下の層またはネットワークからメッセージを受信する役割があります。受信されたメッセージは、チャネル リスナーによって作成されるチャネルを使用して、上の層に配信されます。

メッセージを受信して上の層に配信するプロセスを次の図に示します。

チャネル リスナーとチャネル

このプロセスは、概念上、各チャネル内のキューとしてモデル化できますが、実際には実装がキューを使用しない場合もあります。チャネル リスナーには、下の層またはネットワークからメッセージを受信し、キューに配置する役割があります。また、チャネルには、キューからメッセージを取得し、上の層から (たとえば、チャネル上で Receive を呼び出すことによって) メッセージが要求されたときにそのメッセージを渡す役割があります。

WCF には、このプロセスに対する基本クラス ヘルパーが用意されています (ここで説明するチャネル ヘルパー クラスのダイアグラムについては、「チャネル モデルの概要」を参照してください)。

次の説明は、「トランスポート: UDP」のサンプルに基づいています。

チャネル リスナーの作成

サンプルに実装されている UdpChannelListener は、ChannelListenerBase クラスから派生します。単一の UDP ソケットを使用して、データグラムを受信します。OnOpen メソッドは、非同期ループ内で UDP ソケットを使用してデータを受信します。その後、メッセージ エンコーディング システムを使用して、データを次のようにメッセージに変換します。

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

複数のソースから到着するメッセージが同じデータグラム チャネルで表されるので、UdpChannelListener はシングルトン リスナーです。このリスナーに同時に関連付けられるアクティブな IChannel は、最大 1 つです。このサンプルでは、AcceptChannel メソッドによって返されるチャネルがその後破棄される場合のみ、もう 1 つ生成されます。メッセージが受信されると、このシングルトン チャネルのキューに置かれます。

UdpInputChannel

UdpInputChannel クラスは、IInputChannel を実装しています。このクラスは UdpChannelListener のソケットによって設定される受信メッセージのキューで構成されています。これらのメッセージは、Receive メソッドによってキューから削除されます。