サービス: チャネル リスナーとチャネル
チャネル オブジェクトには、チャネル、チャネル リスナー、およびチャネル ファクトリという 3 つのカテゴリがあります。 チャネルはアプリケーションおよびチャネル スタックとのインターフェイスです。 チャネル リスナーは受信 (またはリッスン) する側のチャネルを作成する役割を果たします。通常は、新しい受信メッセージまたは接続への応答を行います。 チャネル ファクトリは送信側のチャネルを作成し、エンドポイントとの通信を開始する役割を果たします。
チャネル リスナーとチャネル
チャネル リスナーには、チャネルを作成し、下の層またはネットワークからメッセージを受信する役割があります。 受信されたメッセージは、チャネル リスナーによって作成されるチャネルを使用して、上の層に配信されます。
メッセージを受信して上の層に配信するプロセスを次の図に示します。
メッセージを受信してチャネル経由で上の層に配信するチャネル リスナー。
このプロセスは、概念上、各チャネル内のキューとしてモデル化できますが、実際には実装がキューを使用しない場合もあります。 チャネル リスナーには、下の層またはネットワークからメッセージを受信し、キューに配置する役割があります。 また、チャネルには、キューからメッセージを取得し、上の層から (たとえば、チャネル上で 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 は、最大 1 つです。 このサンプルでは、AcceptChannel メソッドによって返されるチャネルがその後破棄される場合のみ、もう 1 つ生成されます。 メッセージが受信されると、このシングルトン チャネルのキューに置かれます。
UdpInputChannel
UdpInputChannel
クラスは、IInputChannel を実装しています。 このクラスは UdpChannelListener
のソケットによって設定される受信メッセージのキューで構成されています。 これらのメッセージは、Receive メソッドによってキューから削除されます。