UnionPlatform (2) 概念

Union Platformには色々な概念が登場します。本家のOverviewで紹介されている5つのコンセプトについてみていきます。UnionのバージョンはUnion alpha3を使用します。

  • Server
  • Client
  • Room
  • Attribute
  • Message

Server

マルチユーザアプリケーションの中心となるのがServerです。クライアント同士はP2Pで直接やりとりすることはありません。必ずServerを介してお互いの情報を共有します。Serverとのやり取りは独自のUPCプロトコルを使用します。この独自のUPCプロトコルで通信するためにFlash PlayerからSocket通信を行います。

Serverとの通信の入り口となるGatewayは複数用意する事が可能です。通常の通信は、デフォルト9100ポートを使うように設定されていますがサーバの設定で変更する事が可能です。

Serverの設定

基本的にServer側のxmlを変更することで対応できます。設定方法は、公式サイトのUnion Server Configurationに詳しく掲載されています。

お試しServer

Union Serverをお試しするには、tryunion.comを使う事が出来ます。

Serverへの接続

Reactorクラスをインスタンス化して、connectメソッドを呼び出します。

var reactor:Reactor = new Reactor();
reactor.addEventListener(ReactorEvent.READY, reactor_readyHandler);
reactor.connect("tryunion.com", 9100);

Client

Union Platformが提供するマルチユーザアプリケーションのユーザに当たるのがClientです。swfをブラウザのFlash Playerから実行する場合、ブラウザのウィンドウを複数立ち上げる事で、1人のユーザが複数のクライアントを操る事も可能です。 各Clientには一意のIDが振られるので、IDをキーにして識別する事が可能です。以下のようなことが出来ます。

  • クライアントIDを指定して、特定のユーザの情報(後述するAttributeなど)を取得する
  • クライアントIDを指定して、特定のユーザへメッセージ(後述するMessage)を送る

自身のClientを参照する

以下のように自身のClientインスタンスを取得出来ます。

// reactorにconnect後、ReactorEvent.READYイベントが送出されている事
var self:IClient = reactor.getClientManager().self();

Client API

net.user1.reactor.Client

Room

前回も紹介したとおり、Union ServerにはRoomという概念があります。Roomはサーバ上に作られる仮想の部屋です。RoomはRoom IDで識別されます。ClientはRoom IDを指定して、好きなRoomへ接続します。Server上に指定したRoom IDが存在しない場合は、新たにRoomを作成する事も出来ます。その際にパスワードを設定して秘密のRoomを作成することも可能です。

複数のRoomへの接続

Clientは1つのコネクションで、複数の部屋に接続する事が可能です。例えば、フリーチャットルームに接続しながら、Serverに接続しているみんなとチャットを楽しみつつ、1対1のゲームにも参加するようなシチュエーションが考えられます。

joinとobserve

またClientはRoomにjoinすること、observeすることが可能です。この違いは、

  • joinは実際に部屋の中に入り、Room内の更新情報を共有します。自分から情報の発信を行うことも出来ます。
  • observeは部屋の中を覗くイメージです。Room内の更新情報を共有するので、Room内で何が起きているのか見る事が出来ます。チャットのROM中のユーザはチャットRoomをobserveしているイメージです。ただし、部屋の出来事に口出しすることは出来ません。

下記の図では、Aさんはobserveをしています。B, C, Dさんは各部屋にjoinしています。Bさんは、2つのRoomに同時にjoinしている事を表しています。 [caption id="attachment_293" align="aligncenter" width="492" caption="joinとobserve"]joinとobserve[/caption]

Roomを作成する

以下のように自身のRoomインスタンスを作成

// reactorにconnect後、ReactorEvent.READYイベントが送出されている事
var room:Room = reactor.getRoomManager().createRoom("unionParty");

Roomにjoin, observeする

以下のようにjoinします。

room.addEventListener(RoomEvent.JOIN, room_joinHandler);
room.join();

observeは以下のようになります。

room.addEventListener(RoomEvent.OBSERVE, room_joinHandler);
room.observe();

Room API

net.user1.reactor.Room

Attribute

ClientとRoomは自身の属性(プロパティ)を複数持つ事が出来ます。これをAttributeと呼びます。自身の属性とは、特徴や設定と考えると分かりやすいかも知れません。属性は、keyとvalueで定義されます。これらの属性を変更した際には、変更通知が行われるためRoomにjoin, observeしたClient間で情報の共有が可能となります。

[caption id="attachment_299" align="aligncenter" width="601" caption="ClientとRoomのAttribute"]ClientとRoomのAttribute[/caption]

具体的な例

あるRoomに4人のClientがjoinしている例を考えます。Roomは、backgroundとtopicというAttributeを持ちます。Clientは、colorとnameというAttributeを持ちます。この状況を下図を使って整理してみます。

[caption id="attachment_295" align="aligncenter" width="650" caption="ClientとRoomのAttributeの例"]ClientとRoomのAttributeの例[/caption]

Roomの背景はオレンジ色で、話題はflashです。このとき、Roomのbackgrond属性はorangeとなり、topic属性はflashとなります。誰かが、「次はiPhoneについて話そう」と提案する際には、Room Attributeのtopicをiphoneに変更します。もちろん、このtopic属性の変化はRoom内のClientに通知されるので、全員が話題の変更に気づきます。

各ユーザはcolor属性で表される自分の発言色と、name属性で表される名前を持ちます。各Clientの属性は以下の通りになります。

  • 1人目のユーザのcolor属性はredで、name属性はA
  • 2人目のユーザのcolor属性はgreenで、name属性はB
  • 3人目のユーザのcolor属性はorangeで、name属性はC
  • 4人目のユーザのcolor属性はpurpleで、name属性はD

Aさんが気分を変えて発言色を青にしたいという場合、Client Attributeのcolor属性をblueに変更します。この変更はRoom内の各Clientに通知されるため、全員にAさんが発言色を青に変えた事を伝える事が出来ます。

RoomのAttributeを設定

Roomインスタンスを通じて設定します。

room.setAttribute("background", "orange");

ClientのAttributeを設定

Clientインスタンスを通じて設定します。

self.setAttribute("color", "blue");

Attribute API

net.user1.reactor.Attribute

Message

Messageは、Clientから発信出来るメソッドになります。Attributeはプロパティで、Messageはメソッドとイメージしておくと良いです。メソッドなので、Message名と任意の引数を渡す事が出来ます。

MessageはServer側から送信することも可能です。RoomにjoinしたClientが居たら、ServerがすべてのClientに通知する、といったシチュエーションが考えられます。

Messageは、基本的にRoomに接続しているClient全員に通知されますが、特定のAttributeを持ったClientだけに通知するなどFilterを使うことで絞り込みを行う事も可能です。

以下の図のように、基本はみんなに向けて発信するメッセージと考えると分かりやすいです。

[caption id="attachment_296" align="aligncenter" width="420" caption="Room Message"]Room Message[/caption]

Filterを使って、特定のAttributeを持つユーザだけにMessageを送る事も出来ますし、Client IDからClientを識別し、特定のClientに向かってMessageを送信する事も可能です。

[caption id="attachment_297" align="aligncenter" width="474" caption="Client Message"]Client Message[/caption]

Messageの送信

Roomに接続しているClientへ送信

room.sendMessage("chatMessage", true, null, "こんにちわ!");

Client IDが3941のClientへ送信

var client:IClient = room.getClient("3941");
client.sendMessage("chatMessage", true, null, "今夜空いてる?");

まとめ

今回は、Union Platformに登場する概念について整理しました。図解すると大分理解が深まりました。次回は情報の共有化において、AttributeとMessageの使いどころを考えて行こうと思います。

関連記事

  1. UnionPlatform (1) 概要
  2. UnionPlatform (2) 概念
  3. Union Platform(3) 情報の共有化
  4. Union Platform(4) Reactorのイベント
  5. Union Platform(5) チャットを作る
  6. Union Platform(6) Union Server入門
  7. Union Platform(7) Union Server Module作成準備
  8. Union Platform(8) Moduleサンプル