ピア チャネル チャット
このチャット サンプルでは、PeerChannel を使用してマルチパーティ チャット アプリケーションを実装する方法を示します。チャット アプリケーションの任意のインスタンスから送信されたメッセージは、他のすべてのインスタンスで受信されます。
このチャット サンプルは、クライアントとサービスの概念には基づいていません。各インスタンスが他のインスタンスのピアとして動作する、純粋なピアツーピア アプリケーションです。各インスタンスでは、IChat
双方向コントラクトを使用して、他のインスタンスにメッセージを送信し、他のインスタンスからのメッセージを受信できます。
このチャット サンプルは「自己ホスト」サンプルに基づいています。さらに、Windows Communication Foundation (WCF) の概要については、「入門サンプル」も参照してください。
メモ : |
---|
このサンプルのセットアップ手順とビルド手順については、このトピックの最後を参照してください。 |
重要な概念 :
PeerChannel とは、Windows Communication Foundation (WCF) のマルチパーティ対応ピアツーピア (P2P) 通信技術です。これにより、安全で、拡張可能な、信頼できるメッセージ機能が実現されます。PeerChannel のメリットを活用するマルチパーティ アプリケーションの一般的な例は、チャットなどの共同作業アプリケーションです。チャットでは、ユーザーのグループがサーバーなしのピアツーピア方式で互いに会話します。PeerChannel を使用することで、顧客シナリオや企業シナリオでの P2P コラボレーション、コンテンツ配布、負荷分散、および分散処理が実現されます。
PeerChannel では、次の新しい概念が導入されています。
メッシュは、互いに通信可能で、それぞれ一意のメッシュ ID により識別されるピア ノードの名前付きコレクション (相関グラフ) です。
メモ : メッシュ内のアクティブ ノードは、メッシュ名を公開して、他のノードが検索できるようにします。メッシュには次の特徴があります。まず、メンバシップの変更に対応します。次に、ノードが常にメッシュに参加したりメッシュから離脱したりする環境で接続を回復する機能があります。さらに、トラフィック パターンに基づいて接続が動的に最適化されます。
「ピア ノード」とは、メッシュ内のエンドポイントのことです。単一のアプリケーションは、ピア ノードを複数持って、異なるメッシュに参加することができます。
ピア リゾルバは、メッシュ ID をメッシュ内のノードのエンドポイント アドレスに解決します。ピア ノードはこのアドレスを使用してメッシュ内の別のノードに接続します。これにより、メッセージがメッシュ内で伝達されるようになります。
チャットは、コンソール アプリケーションです。チャット アプリケーションの各インスタンスでは、同じエンドポイント アドレスを持つ IDuplexChannel が作成されます。したがって、ピア チャネルのチャット アプリケーションの 1 つのインスタンスから送信されるメッセージは、他のすべてのインスタンスで受信されます (すべてのインスタンスで同じアドレスを使用しているからです)。
チャット アプリケーションでは、IChat
双方向コントラクトが定義され、実装されます。ServiceModel は単一要求 - 複数応答パラダイムをサポートしていないので、IChat
コントラクトでは一方向操作のみが可能です (マルチパーティ チャネルの場合は、メッシュに送信される単一の要求によって複数の応答が生成されます)。
このサンプルは、静的な main 関数を実装することにより、IChat
双方向コントラクトを含み、構成ファイルで指定されたエンドポイントを使用する IClientChannel を作成します。
すべてのチャット インスタンスでは同じエンドポイント アドレスを使用して、あるインスタンスから送信されるメッセージが他のすべてのインスタンスで受信されるようにする必要があります。
このサンプルのチャット インスタンスは、カスタム リゾルバまたは既定のピア リゾルバ (PNRP) を使用して相互検索を行います。PNRP は Windows Server 2003 では利用できません。したがって、Windows Server 2003 が動作するシステムでこのサンプルを実行する場合は、カスタム ピア リゾルバを使用する必要があります。既定では、このサンプルはカスタム リゾルバを使用するように設定されています。カスタム リゾルバまたは既定のリゾルバのどちらを使用するかは、次の構成ファイルで定義されるチャット エンドポイントによって決まります。既定のピア リゾルバ (PNRP) に切り替えるには、サンプルの構成ファイルで、bindingConfiguration の下の "BindingCustomResolver" を "BindingDefault" に置き換えます。
<!-- chat instance participating in the mesh -->
<endpoint name="ChatEndpoint"
address="net.p2p://chatMesh/ServiceModelSamples/Chat"
binding="netPeerTcpBinding"
bindingConfiguration="BindingCustomResolver"
contract="Microsoft.ServiceModel.Samples.IChat">
</endpoint>
ピア ノードでピア チャネル カスタム ピア リゾルバ サービスと通信するには、クライアント側のピア チャネル カスタム ピア リゾルバの構成を構成ファイル内で定義します。
<!-- Client used to communicate with the custom resolver service. -->
<client>
<endpoint configurationName="CustomPeerResolverEndpoint"
address="net.tcp://localhost/ServiceModelsamples/peerResolverService"
binding="netTcpBinding"
bindingConfiguration="Binding3"
contract="Microsoft.ServiceModel.SamplesICustomPeerResolver">
</endpoint>
</client>
アドレスでは、リゾルバ サービスのアドレスが識別されます。リゾルバ サービスがリモート コンピュータで実行されている場合は、localhost
を、修飾ドメイン名に置き換えます。
このサンプルでは、IClientChannel からピア ノードを取得する方法と、IOnlineStatus を使用して、そのピア ノードをオンライン イベントとオフライン イベントで登録する方法も示されます。ピア ノードがメッシュ内の少なくとも 1 つのピア ノードに接続されると、オンライン イベントが発生します。ピア ノードがメッシュ内のすべてのピア ノードとの接続を失うと、オフライン イベントが発生します。
現在はピア チャネルが サービス メタデータ ユーティリティ (Svcutil.exe) と統合されていないので、メタデータを生成することはできません。
このサンプルを実行すると、チャット インスタンスから送信されたチャット メッセージが、他のチャット インスタンスのコンソール ウィンドウに表示されます。Q キーを押して Enter キーを押すと、それぞれのコンソール ウィンドウでインスタンスがシャットダウンされます。
メモ : |
---|
このサンプルでは現在、インフラストラクチャでスローされる可能性のあるすべての例外が扱われているわけではありません。これらのサンプルを商用環境または本運用環境で使用する場合は、適切な例外処理に関するベスト プラクティスに従うようにしてください。 |
サンプルを設定、ビルド、および実行するには
「Windows Communication Foundation サンプルの 1 回限りのセットアップの手順」が実行済みであることを確認します。
ソリューションの C# 版または Visual Basic .NET 版をビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。
単一コンピュータ構成か複数コンピュータ構成かに応じて、「Windows Communication Foundation サンプルの実行」の手順に従います。
また、このチャット サンプルでは次の手順が適用されます。手順 3. でクライアントとサービスに言及されている場合、それらの手順はサンプルの別個のインスタンスに適用されます (チャット サンプルにはクライアントとサービスの概念がないからです)。
bindingConfiguration が BindingDefault に設定されている場合は、PNRP がインストールされており、すべてのコンピュータで使用できることを確認してください。
アプリケーションのインスタンスを必要な数だけ開始します。最初に、特定のクライアント インスタンスから送信されるメッセージを区別するためのニックネームを入力します。この名前を入力するとすぐに、チャット メッセージをメッシュに送信できます。こうしたメッセージは、個別のメンバ名を持つ他のすべてのインスタンスにエコーされる必要があります (つまり、名前が同じクライアントから送信されるメッセージは表示されず、1 つのクライアントで作成されたメッセージは、コンソールにエコーされません)。
Copyright © 2007 by Microsoft Corporation.All rights reserved.