People Near Meネットワークへのオブジェクト発行
続いて近隣ユーザーに対して任意のデータ(オブジェクト)を公開してみましょう。
まずはオブジェクトを公開するプログラムを作ります(Sample04)。オブジェクト公開のためのコードは次のとおりです。

using System; //中略 using System.Net.PeerToPeer.Collaboration; // People Near Me namespace Sample04 { /// <summary> /// Interaction logic for Window1.xaml /// </summary> public partial class Window1 : Window { const string __GUID_OBJECT = "11111111-2222-3333-4444-555555555555"; public Window1() { InitializeComponent(); PeerCollaboration.SignIn(PeerScope.NearMe); } void ObjectPublishButton_Clicked(Object sender, RoutedEventArgs e) { PeerObject obj = new PeerObject(new Guid(__GUID_OBJECT), Encoding.Unicode.GetBytes(ObjectTextBox.Text), PeerScope.NearMe); PeerCollaboration.SetObject(obj); } } }
オブジェクトの公開にあたっては「GUID」「公開範囲」「公開するデータ」を設定する必要があります。これらの情報をセットしPeerObjectインスタンスを生成し、PeerCollaborationクラスのSetObjectメソッドをコールすることでオブジェクトを公開することができます。「Sample04」ではTextBoxに入力されて文字列情報をオブジェクトとして公開します。
そして公開されたオブジェクトを取得するためのプログラムは次のとおりです(Sample05)。

using System; using System.Collections; //中略 using System.Net.PeerToPeer.Collaboration; // People Near Me namespace Sample05 { /// <summary> /// Interaction logic for Window1.xaml /// </summary> public partial class Window1 : Window { const string __GUID_OBJECT = "11111111-2222-3333-4444-555555555555"; public Window1() { InitializeComponent(); PeerCollaboration.SignIn(PeerScope.NearMe); } void ObjectListGetButton_Clicked(Object sender, RoutedEventArgs e) { ListUpObject(); } void ListUpObject() { PeerNearMeCollection pnms = PeerCollaboration.GetPeersNearMe(); foreach (PeerNearMe pnm in pnms) { pnm.RefreshData(); string szPublishData = pnm.Nickname; foreach (PeerObject obj in pnm.GetObjects( new Guid(__GUID_OBJECT))) { string szObj = Encoding.Unicode.GetString(obj.Data); szPublishData += " : " + szObj; } ObjectList.Items.Add(szPublishData); } } } }
近隣ピアの持つオブジェクトを、GetObjectsメソッドをコールすることで取得することができます。なお、オブジェクトを取得するためにはRefreshDataを呼ぶ必要があります。リフレッシュをしないと取得ができませんのでご注意ください。
さて、それではこのテストをしてみることにしましょう。まずいくつかのピアの上で「Sample04」のプログラムを実行してください。そして、「Sample04」を実行させたまま、「Sample05」のプログラムを実行してみましょう。「Sample05」プログラムのListBoxにピアのニックネームと共に公開されているオブジェクトの情報が表示されていることが分かります。

以上がオブジェクトの公開、取得の方法です。今回はオブジェクトとして文字列を使いましたが、文字列以外のオブジェクトを利用することも可能です。
「にこにこメッセ」の実装
さて今回のおさらいとして以上の機能のまとめとしてPNMへの参加、PNMオブジェクトの公開の機能を利用した「にこにこメッセ」を作ってみましょう。プロジェクト管理などに「にこにこカレンダー」を使っている方も多いとは思いますが、メッセージを送るときに自分のご機嫌状態も一緒に送ってあげることのできるメッセンジャーライクなアプリケーションを作ります。
NikoMessengerプロジェクトをビルドし、デバッグしながらいろいろと操作してみてください。送信するメッセージはPNMオブジェクトとして扱い、通信するユーザーはPNMの参加・脱退の機構を利用し管理していることが分かると思います。
内部実装の都合上、本アプリケーションはPNMからサインアウトされた状態で実行するようにしてください。詳細な説明はスペースの都合上省略させて頂きますが、本コードをいろいろカスタマイズしてPNMプログラムに対する参考にしてみてください。PNMを使ったアプリケーションのアイデアが浮かんでくるものと思います。
なお、本サンプル中には多くの不備もあるとは思います。Beta1のクラスであることを踏まえ、ご了承ください。
まとめ
今回はPeople Near Meの概要と近隣ユーザーの発見、近隣ユーザーの公開するオブジェクトの管理機能についての紹介と実装方法について述べてきました。このPeople Near Meはさまざまなコラボレーションソフトを実現するための有効な機能であると思います。皆さんもPeople Near Meを使って今までになかった素晴らしいコラボレーションソフトを開発していただけたらと思います。
次回は「近隣ユーザーの持つアプリケーションの発見」、「特定ユーザーとの永続的コネクション管理」の機能についての解説を行う予定です。
なお、本記事の内容は次期.NET Framework 3.5環境(Codename "Orcas" Beta1)の利用を前提に書かれていますので、正式リリース時点でサンプルコードが正常に動作することは保証されません。それをご理解の上、本記事を参照、利用するようにしてください。

