次の方法で共有


WCF のチャットのサンプル

更新 : 2007 年 11 月

このチャットのサンプルでは、PeerChannel を使用してマルチパーティ チャット アプリケーションを実装する方法を示します。チャット アプリケーションのいずれかのインスタンスから送信されたメッセージは、他のすべてのインスタンスで受信されます。

サンプルとそのインストール手順を取得するには

  • 次のいずれかを実行します。

    • [ヘルプ] メニューの [サンプル] をクリックします。

      サンプルの情報を示す Readme が表示されます。

    • Visual Studio 2008 のサンプルの Web サイトにアクセスします。ここには、サンプルの最新版が掲載されています。

    • Visual Studio をインストールしたコンピュータで、サンプルを検索します。既定では、サンプルおよび Readme ファイルは drive:\Program Files\Microsoft Visual Studio 9.0\Samples\lcid にインストールされています。Visual Studio の Express Edition については、すべてのサンプルがオンラインで提供されています。

詳細については、「サンプル ファイルの格納場所」を参照してください。

Bb690929.alert_security(ja-jp,VS.90).gifセキュリティに関するメモ :

このサンプル コードは概念を示すためのものであり、その概念に関連するコードのみを示しています。特定の環境について必ずしもセキュリティ要件を満たしていませんので、そのまま使用しないでください。セキュリティおよびエラー処理コードを追加して、プロジェクトをより安全かつ堅牢にすることをお勧めします。これらのサンプル コードは、現状有姿のままで提供されるものであり、一切保証されていません。

サンプルを実行するには

  1. ソリューション エクスプローラで、.sln ファイルを開きます。

    手順がクライアントまたはサービスを指している場合、それらの手順はサンプルの別個のインスタンスに適用されます。これは、チャット サンプルがクライアント/サービス アプリケーションではないためです。

  2. F5 キーを押してチャット アプリケーションを実行します。

  3. インスタンス (Visual Basic installation path\Projects\Chat\Instance\Bin\Debug\Instance.exe にある名前付きインスタンス) を必要な数だけ起動します。まず、特定のクライアント インスタンスから送信されたメッセージを区別するためのニックネームを入力します。この名前を入力するとすぐに、メッシュにチャット メッセージを送信できます。このようなメッセージは、別個のメンバ名を持つ他のすべてのインスタンスに送信される必要があります (つまり、同じ名前を持つクライアントからのメッセージは表示されず、クライアント自身のメッセージはそのクライアントのコンソール ウィンドウには送信されません)。

使用例

このチャットのサンプルは、クライアント/サービス アプリケーションではありません。各インスタンスが他のインスタンスのピアとして動作する、純粋なピアツーピア アプリケーションです。各インスタンスは、IChat 双方向コントラクトを使用して、他のインスタンスとのメッセージの送受信を実行できます。

主要概念

PeerChannel は、WCF (Windows Communication Foundation) のマルチパーティ対応ピアツーピア (P2P: Peer-to-Peer) 通信技術です。この技術により、安全で、拡張可能な、信頼性の高いメッセージングが実現します。PeerChannel を利用したマルチパーティ アプリケーションの一般的な例として、チャットなどの共同作業アプリケーションがあります。チャットでは、ユーザーのグループが、サーバーを使用しないピアツーピア方式で相互に通信します。PeerChannel により、コンシューマとエンタープライズの両方のシナリオで、P2P コラボレーション、コンテンツ配布、負荷分散、および分散処理を行うことができます。

PeerChannel では、次の新しい概念が導入されています。

  • メッシュは、相互に通信でき、それぞれ一意のメッシュ ID で識別されるピア ノードの名前付きコレクション (相関グラフ) です。

    Bb690929.alert_note(ja-jp,VS.90).gifメモ :

    メッシュ内のアクティブ ノードは、メッシュ名を公開して、他のノードから検索できるようにします。メッシュは、メンバシップの変更に対応し、ノードが常にメッシュに参加したりメッシュから離脱したりする環境で柔軟に接続を行い、トラフィック パターンに応じて動的に最適化されます。

  • メッシュ内のアクティブ ノードは、メッシュ名を公開して、他のノードから検索できるようにします。メッシュは、メンバシップの変更に対応し、ノードが常にメッシュに参加したりメッシュから離脱したりする環境での接続を柔軟に行い、トラフィック パターンに基づいて動的に最適化されます。

  • ピア ノードは、メッシュ内のエンドポイントです。1 つのアプリケーションが、異なるメッシュに参加する複数のピア ノードを持つことができます。

  • ピア リゾルバは、メッシュ ID をメッシュ内のノードのエンドポイント アドレスに解決します。ピア ノードは、これらのアドレスを使用してメッシュ内の他のノードに接続します。これにより、メッシュ内でメッセージを転送できます。

チャットは、Windows フォーム アプリケーションです。チャット アプリケーションの各インスタンスが、同じエンドポイント アドレスを持つ IDuplexChannel を 1 つ作成します。チャット アプリケーションのすべてのインスタンスが同じアドレスを使用するので、1 つのインスタンスから送信されたメッセージが、そのピア チャネルの他のすべてのインスタンスによって受信されます。

チャット アプリケーションは、IChat 双方向コントラクトを定義し、実装します。ServiceModel は単一要求/複数応答パラダイムをサポートしていないので、IChat コントラクトでは一方向操作のみを行うことができます (マルチパーティ チャネルの場合は、メッシュに送信される単一の要求によって複数の応答が生成されます)。

このサンプルでは、静的な Main 関数を実装して、IChat 双方向コントラクトを含む IClientChannel を作成します。この関数は、構成ファイルで指定されたエンドポイントを使用します。

1 つのインスタンスから送信されたメッセージが他のすべてのインスタンスで受信されるように、すべてのチャット インスタンスで同じエンドポイント アドレスを使用する必要があります。

このサンプルのチャット インスタンスは、カスタム リゾルバまたは既定のピア リゾルバ (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 キーを押すと、インスタンスが終了します。

Bb690929.alert_note(ja-jp,VS.90).gifメモ :

このサンプルでは、現在、インフラストラクチャでスローされる可能性のあるすべての例外は処理されません。これらのサンプルを商用環境または稼動環境で使用する場合は、適切な例外処理に関するベスト プラクティスに従ってください。

参照

処理手順

チュートリアル : WCF サービスの作成とアクセス

ASMX サービスと WCF サービスを利用するサンプル