People Near Me参加ユーザーのリストアップ
次に他ピアとのコラボレーションのための第一歩として、People Near Meネットワークに参加しているユーザーの一覧を取得してみることにしましょう。準備作業として、同一サブネットワークに属している他のVistaマシンのユーザーでPNMに参加しておいてください(「ファイル名を指定して実行」から"p2phost"と入力して実行することでPNMホストプロセスを起動することができます)。
複数マシンの用意が難しい方はVirtual PCなどでゲストOSとしてVistaを用意することも可能です。もし共に難しい場合は、今動作させているVistaマシンに新規ユーザーを作成しそのユーザーセッションにおいてPNMに参加してください。PNMはユーザーセッションごとに別なピアとして認識されます。
準備作業が完了しましたら、「Sample02」のプロジェクトをビルドし実行してみてください。取得ボタンを押すと他ピアのニックネームの一覧表示されることと思います。

では、コードを見ていくことにしましょう。
using System; //中略 using System.Net.PeerToPeer.Collaboration; // People Near Me namespace Sample02 { /// <summary> /// Interaction logic for Window1.xaml /// </summary> public partial class Window1 : Window { public Window1() { InitializeComponent(); PeerCollaboration.SignIn(PeerScope.NearMe); } void PeerListGetButton_Clicked(Object sender, RoutedEventArgs e) { ListupPeopleNearMe(); } void ListupPeopleNearMe() { PeerNearMeCollection pnms = PeerCollaboration.GetPeersNearMe(); foreach (PeerNearMe pnm in pnms) { PeerList.Items.Add(pnm.Nickname); } } } }
近隣ユーザー一覧の取得はPeerCollaborationクラスのGetPeersNearMeメソッドをコールすることで実現します。これによりPeerNearMeCollectionのインスタンスを取得でき、近隣ユーザーの情報を扱うことができるようになります。
他ユーザーのPeople Near Meネットワークの参加、脱退のイベント取得
「Sampel2」のアプリケーションだと、ある時点でのPNMネットワークの状況は分かるもののリアルタイムにユーザーの参加・脱退を把握することができません。そこで続いてはユーザー参加、脱退のイベント処理について解説していきたいと思います。
まずは「Sample3」を実行し、取得ボタンを押した後、近隣ピアのPNMへの参加・脱退状態を変化させてみてください。ListBoxに表示されているピア一覧情報がリアルタイムに変化することが分かります。

それではコードを見ていきます。
using System; using System.Collections; //中略 using System.Net.PeerToPeer.Collaboration; // People Near Me namespace Sample03 { /// <summary> /// Interaction logic for Window1.xaml /// </summary> public partial class Window1 : Window { public Window1() { InitializeComponent(); PeerCollaboration.SignIn(PeerScope.NearMe); } void PeerListGetButton_Clicked(Object sender, RoutedEventArgs e) { ListupPeopleNearMe(); PeerNearMe.PeerNearMeChanged += new EventHandler<PeerNearMeChangedEventArgs>( PeerNearMe_PeerNearMeChanged); } void ListupPeopleNearMe() { PeerNearMeCollection pnms = PeerCollaboration.GetPeersNearMe(); foreach (PeerNearMe pnm in pnms) { PeerList.Items.Add(pnm.Nickname); } } void PeerNearMe_PeerNearMeChanged(Object sender, PeerNearMeChangedEventArgs e) { PeerNearMe pnm = e.PeerNearMe as PeerNearMe; switch (e.PeerChangeType) { case PeerChangeType.Added: PeerList.Items.Add(pnm.Nickname); break; case PeerChangeType.Deleted: PeerList.Items.Add(pnm.Nickname); break; case PeerChangeType.Updated: break; default: break; } } } }
近隣ピアの状態を通知するイベントはPeerNearMeクラス内PeerNearMeChangedイベントとして実装されています。そのため、PNMの状態をリアルタイムに把握するには、このイベントコールバックを実装すればよいということになります。
イベント取得後はコールバック関数内(PeerNearMe_PeerNearMeChanged)でピアの変更イベント種別PeerChangeTypeの状態(Added、Deleted、Updated)に応じた処理をしています。
