<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>fla.la &#187; Union Platform</title>
	<atom:link href="http://fla.la/archives/category/union_platform/feed" rel="self" type="application/rss+xml" />
	<link>http://fla.la</link>
	<description>FLASH関連のネタを粛々とポストしていくのです。最近はUnion Platformに夢中</description>
	<lastBuildDate>Mon, 14 Dec 2009 04:46:45 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>UnionPlatformを紹介しました</title>
		<link>http://fla.la/archives/561</link>
		<comments>http://fla.la/archives/561#comments</comments>
		<pubDate>Tue, 06 Oct 2009 05:11:41 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[Union Platform]]></category>
		<category><![CDATA[slide]]></category>

		<guid isPermaLink="false">http://fla.la/?p=561</guid>
		<description><![CDATA[このブログを通してお伝えしてきましたUnion Platfom関連のお話は、会社のODF（One Day Free）という制度を使って調査して来ました。 そして先日、社内のODF発表会でUnion Platformの概要部分だけをざっくり解説しました。ブログへの掲載許可を頂いたので、その時のスライドを紹介します。５分ぐらいで発表したのでざっくり概要を知るには良いかも知れません。 Union Platformの紹介(クリックで始まります。以降のスライドへはダブルクリックで進みます。) もっとUnion Platformを知りたい方は以下の記事もご確認下さい。 関連記事 UnionPlatform (1) 概要 UnionPlatform (2) 概念 Union Platform(3) 情報の共有化 Union Platform(4) Reactorのイベント Union Platform(5) チャットを作る Union Platform(6) Union Server入門 Union Platform(7) Union Server Module作成準備 Union Platform(8) Moduleサンプル]]></description>
			<content:encoded><![CDATA[<p>このブログを通してお伝えしてきましたUnion Platfom関連のお話は、会社のODF（One Day Free）という制度を使って調査して来ました。</p>
<p>そして先日、社内のODF発表会でUnion Platformの概要部分だけをざっくり解説しました。ブログへの掲載許可を頂いたので、その時のスライドを紹介します。５分ぐらいで発表したのでざっくり概要を知るには良いかも知れません。</p>
<p><a href="http://koshikawa.net/slide/union/introduction/">Union Platformの紹介</a>(クリックで始まります。以降のスライドへはダブルクリックで進みます。)</p>
<p>もっとUnion Platformを知りたい方は以下の記事もご確認下さい。</p>
<h3>関連記事</h3>
<ol>
<li><a href="http://fla.la/archives/248" title="UnionPlatform (1) 概要">UnionPlatform (1) 概要</a></li>
<li><a href="http://fla.la/archives/287" title="UnionPlatform (2) 概念">UnionPlatform (2) 概念</a></li>
<li><a href="http://fla.la/archives/351" title="Union Platform(3) 情報の共有化">Union Platform(3) 情報の共有化</a></li>
<li><a href="http://fla.la/archives/315" title="Union Platform(4) Reactorのイベント">Union Platform(4) Reactorのイベント</a></li>
<li><a href="http://fla.la/archives/364" title="Union Platform(5) チャットを作る">Union Platform(5) チャットを作る</a></li>
<li><a href="http://fla.la/archives/347" title="Union Platform(6) Union Server入門">Union Platform(6) Union Server入門</a></li>
<li><a href="http://fla.la/archives/365" title="Union Platform(7) Union Server Module作成準備">Union Platform(7) Union Server Module作成準備</a></li>
<li><a href="http://fla.la/archives/369" title="Union Platform(8) Moduleサンプル">Union Platform(8) Moduleサンプル</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/561/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Union Platformのgoogle group</title>
		<link>http://fla.la/archives/546</link>
		<comments>http://fla.la/archives/546#comments</comments>
		<pubDate>Sat, 03 Oct 2009 15:40:51 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[Union Platform]]></category>

		<guid isPermaLink="false">http://fla.la/?p=546</guid>
		<description><![CDATA[Union PlatformのGoogleグループを作成しています。 Union Platformに興味がある方は是非、http://bit.ly/uniongrpへ。 お気軽にご参加下さい。 サンプルを充実させたいので、まずはサンプルの準備をして行きたいと思います。]]></description>
			<content:encoded><![CDATA[<p>Union PlatformのGoogleグループを作成しています。</p>
<p>Union Platformに興味がある方は是非、<a href="http://bit.ly/uniongrp">http://bit.ly/uniongrp</a>へ。<br />
お気軽にご参加下さい。</p>
<p>サンプルを充実させたいので、まずはサンプルの準備をして行きたいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/546/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>the Union Procecure Callの仕様を読む</title>
		<link>http://fla.la/archives/490</link>
		<comments>http://fla.la/archives/490#comments</comments>
		<pubDate>Tue, 08 Sep 2009 03:39:48 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[Union Platform]]></category>
		<category><![CDATA[specification]]></category>

		<guid isPermaLink="false">http://fla.la/?p=490</guid>
		<description><![CDATA[Unionプラットフォームで使用されるUPCプロトコルの仕様を読んでみました。 ついでに、メモ書き程度に訳してみました。 UPC versionは、1.4.0(2009年09月4日現在)となっております。 UPCとは、the Union Procecure Callの略です。ReactorとUnion Serverとの間で取り交わされる内部的なメッセージフォーマットです。基本的に、Unionを利用する開発者が意識的に操作することはありません。 構造 UPCは簡単なXML形式で表されます。XMLには、メッセージIDと複数の引数のリストが含まれます。 以下がUPCの例です。 &#60;U&#62; &#60;M&#62;C2S_CLIENT_HELLO(u65)&#60;/M&#62; &#60;L&#62; &#60;A&#62;Reactor&#60;/A&#62; &#60;A&#62;Flash Player WIN 10,0,32,18 StandAlone (debug, localTrusted); 1.0.0 (Build 252)&#60;/A&#62; &#60;A&#62;1.4.0&#60;/A&#62; &#60;/L&#62; &#60;/U&#62; メッセージID C2S_CLIENT_HELLO(u65) 引数リスト Reactor Flash Player WIN 10,0,32,18 StandAlone (debug, localTrusted); 1.0.0 (Build 252) 1.4.0 メッセージID メッセージIDは()内のショートコードが一意となっています。L要素内の各A要素が引数のリストとなります。 予約語 完全修飾Room IDには、*(アスタリスク), &#124;(パイプ)を含めることが出来ません。 *(アスタリスク) *(アスタリスク)はRoom IDの修飾時に、ワイルドカードとして働きます。たとえば、 com.asmple.chat.* はcom.asmple.chat.fashion, [...]]]></description>
			<content:encoded><![CDATA[<p>Unionプラットフォームで使用される<a href="http://unionplatform.com/specs/upc/">UPCプロトコルの仕様</a>を読んでみました。<br />
ついでに、メモ書き程度に訳してみました。</p>
<p>UPC versionは、1.4.0(2009年09月4日現在)となっております。<br />
UPCとは、the Union Procecure Callの略です。ReactorとUnion Serverとの間で取り交わされる内部的なメッセージフォーマットです。基本的に、Unionを利用する開発者が意識的に操作することはありません。</p>
<p><span id="more-490"></span></p>
<h3>構造</h3>
<p>UPCは簡単なXML形式で表されます。XMLには、メッセージIDと複数の引数のリストが含まれます。</p>
<p>以下がUPCの例です。</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;U<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;M<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>C2S_CLIENT_HELLO(u65)<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/M<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;L<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Reactor<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Flash Player WIN 10,0,32,18 StandAlone (debug, localTrusted); 1.0.0 (Build 252)<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1.4.0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/L<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/U<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<dl>
<dt>メッセージID</dt>
<dd>C2S_CLIENT_HELLO(u65)</dd>
<dt>引数リスト</dt>
<dd>
<ul>
<li>Reactor</li>
<li>Flash Player WIN 10,0,32,18 StandAlone (debug, localTrusted); 1.0.0 (Build 252)</li>
<li>1.4.0</li>
</ul>
</dd>
</dl>
<h4>メッセージID</h4>
<p>メッセージIDは()内のショートコードが一意となっています。L要素内の各A要素が引数のリストとなります。</p>
<h4>予約語</h4>
<p>完全修飾Room IDには、*(アスタリスク), |(パイプ)を含めることが出来ません。</p>
<h5>*(アスタリスク)</h5>
<p>*(アスタリスク)はRoom IDの修飾時に、ワイルドカードとして働きます。たとえば、</p>
<pre>
com.asmple.chat.*
</pre>
<p>はcom.asmple.chat.fashion, com.asmple.chat.gameなど、com.asmple.chat.で修飾されるRoom IDすべてを指します。</p>
<h5>|(パイプ)</h5>
<p>|(パイプ)は項目の区切りとして使用します。</p>
<p>以下のようなメッセージで確認できます。</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;U<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;M<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>C2S_CREATE_ROOM(u24)<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/M<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;L<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><span style="color: #339933;">&lt;![CDATA[com.asmple.union.alpha4.test]] &gt;&lt;/A&gt;</span>
<span style="color: #339933;">		&lt;A&gt;&lt;![CDATA[_DIE_ON_EMPTY|true|_MAX_CLIENTS|-1|_PASSWORD||_CLIENT_TIMEOUT|-1]] &gt;&lt;/A&gt;</span>
<span style="color: #339933;">		&lt;A&gt;&lt;/A&gt;</span>
<span style="color: #339933;">		&lt;A&gt;&lt;/A&gt;</span>
<span style="color: #339933;">	&lt;/L&gt;</span>
<span style="color: #339933;">&lt;/U&gt;</span></pre></div></div>

<p>上記のUPCメッセージは、以下のコードを実行した際にUnion Serverへ送信されたものです。</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #009900;">// _reactorはReactorEvent.READYイベントを送出済みのReactorインスタンス</span>
<span style="color: #6699cc; font-weight: bold;">var</span> room<span style="color: #000000; font-weight: bold;">:</span>Room = _reactor.getRoomManager<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.createRoom<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;com.asmple.union.alpha4.test&quot;</span><span style="color: #000000;">&#41;</span>;</pre></div></div>

<p><a href="http://keno.serio.jp/union/docs/reactor/api/net/user1/reactor/RoomManager.html#createRoom%28%29">RoomManagerインスタンスのcreateRoomメソッド</a>の引数を確認すると第二引数はRoomSettingsインスタンスを受け取ることが分かります。</p>
<p>この例では、第二引数以降を省略しているため、内部でデフォルトのRoomSettingsを渡していると思われます。</p>
<p><a href="http://keno.serio.jp/union/docs/reactor/api/net/user1/reactor/RoomSettings.html">RoomSettings</a>のドキュメントを確認すると、デフォルトの値と先ほどのUPCのメッセージの引数として渡されている値が一致していることが分かります。</p>
<p>このようにRoomのセッティングの内容が|(パイプ)区切りで送信されていることが分かります。</p>
<p>この|(パイプ)の文字列は、<a href="http://keno.serio.jp/union/docs/reactor/api/net/user1/reactor/Tokens.html#RS">Tokens.RS定数</a>の値です。</p>
<h3>ネイティブUPCメッセージ</h3>
<p>UPCで定義されるメッセージ一覧です。とてつもなく長いです。</p>
<h4>ReactorからUnion Serverへ送信されるメッセージ</h4>
<h5>SEND_MESSAGE_TO_ROOMS</h5>
<p>Union Serverに対して、Message識別子で識別されるRECEIVE_MESSAGE(u7)メッセージの送信を要求します。Union Serverは指定されたRoom IDリストに含まれるRoomにjoin, observeし、指定されてたフィルター条件に合致するClientへRECEIVE_MESSAGE(u7)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u1</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Message識別子</li>
<li>Tokens.RS区切りの送信先Room IDリスト</li>
<li>送信先に自身を含むかどうかのフラグ</li>
<li>フィルター</li>
<li>sendMessageの引数(以降、複数指定可能</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>RoomManager.sendMessage()</li>
<li>Room.sendMessage()</li>
</ul>
</dd>
</dl>
<h5>SEND_MESSAGE_TO_CLIENTS</h5>
<p>Union Serverに対して、Message識別子で識別されるRECEIVE_MESSAGE(u7)メッセージの送信を要求します。Union Serverは指定されたClient IDリストに含まれ、指定されてたフィルター条件に合致するClientへRECEIVE_MESSAGE(u7)メッセージを送信します。ただし、Client.sendMessage()の実装では、フィルターはなし、指定出来るClient IDは固定でClientインスタンスが表すClient ID1つです。</p>
<dl>
<dt>内部コード</dt>
<dd>u2</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Message識別子</li>
<li>Tokens.RS区切りの送信先Client IDリスト</li>
<li>フィルター</li>
<li>sendMessageの引数(以降、複数指定可能)</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Client.sendMessage()</li>
</ul>
</dd>
</dl>
<h5>SEND_MESSAGE_TO_SERVER</h5>
<p>Union Serververに対して、Message識別子で識別されるRECEIVE_MESSAGE(u7)メッセージの送信を要求します。Union Serverは指定されたフィルター条件に合致するClientへRECEIVE_MESSAGE(u7)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u57</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Message識別子</li>
<li>送信先に自身を含むかどうかのフラグ</li>
<li>フィルター</li>
<li>sendMessageの引数(以降、複数指定可能)</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Server.sendMessage()</li>
</ul>
</dd>
</dl>
<h5>SET_CLIENT_ATTR</h5>
<p>Union Serverに対して、指定したClientのClient Attributeの設定を要求します。Union Serverは要求の結果をSET_CLIENT_ATTR_RESULT(u73)メッセージで送信します。成功した場合、Union Serverは、CLIENT_ATTR_UPDATE(u8)メッセージも送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u3</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Client ID</li>
<li>Client Attribute名</li>
<li>Client Attribute値</li>
<li>スコープ</li>
<li>オプションを8bitで指定</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Client.setAttribute()</li>
</ul>
</dd>
</dl>
<h5>JOIN_ROOM </h5>
<p>Union Serverに対して、指定したRoomへのjoinを要求します。Union Serverは要求の結果をJOIN_ROOM_RESULT(u72)メッセージで送信します。成功した場合、Union Serverは、JOINED_ROOM(u6)メッセージも送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u4</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Room パスワード</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Room.join()</li>
</ul>
</dd>
</dl>
<h5>SET_ROOM_ATTR</h5>
<p>Union Serverに対して、指定したRoomのRoom Attributeの設定を要求します。Union Serverは要求の結果をSET_ROOM_ATTR_RESULT(u74)メッセージで送信します。成功した場合、Union Serverは、ROOM_ATTR_UPDATE(u9)メッセージも送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u5</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Room Attribute名</li>
<li>Room Attribute値</li>
<li>オプションを8bitで指定</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Room.setAttribute()</li>
</ul>
</dd>
</dl>
<h5>LEAVE_ROOM</h5>
<p>Union Serverに対して、送信元のClientを指定したRoomからのleaveを要求します。Union Serverは要求の結果をLEAVE_ROOM_RESULT(u76)メッセージで送信します。成功した場合、Union Serverは、LEFT_ROOM(u44)メッセージも送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u10</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Room.leave()</li>
</ul>
</dd>
</dl>
<h5>CREATE_PERSISTENT_CLIENT</h5>
<p>Union Serverに対して、送信元のClientをデータベース内の永続化クライアントとしての登録を要求します。</p>
<dl>
<dt>内部コード</dt>
<dd>u11</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Client名</li>
<li>Clientパスワード</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>PersistenceManager.createPersistentClient()</li>
</ul>
</dd>
</dl>
<h5>REMOVE_PERSISTENT_CLIENT</h5>
<p>Union Serverに対して、送信元のClientをデータベース内の永続化クライアントとしての解除を要求します。</p>
<dl>
<dt>内部コード</dt>
<dd>u12</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Client名</li>
<li>Clientパスワード</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>PersistenceManager.removePersistentClient()</li>
</ul>
</dd>
</dl>
<h5>CHANGE_PERSISTENT_CLIENT</h5>
<p>Union Serverに対して、送信元のClientの永続化クライアントパスワード変更を要求します。</p>
<dl>
<dt>内部コード</dt>
<dd>u13</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Client名</li>
<li>Clientの現在のパスワード</li>
<li>Clientの新しいパスワード</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>PersistenceManager.changePersistentClient()</li>
</ul>
</dd>
</dl>
<h5>LOGIN_CLIENT</h5>
<p>Union Serverに対して、送信元のClientに対応した永続化クライアントでのログインを要求します。Union Serverは、永続化クライアントのClient AttributeをCLIENT_ATTR_UPDATE(u8)メッセージで送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u14</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Client名</li>
<li>Clientパスワード</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>PersistenceManager.loginClient()</li>
</ul>
</dd>
</dl>
<h5>GET_NUM_CLIENTS</h5>
<p>Union Serverに対して、指定したRoom内のClient数を要求する。Union Serverは要求の結果をGET_NUM_CLIENTS_RESULT(u75)メッセージで送信します。成功した場合、Union ServerはNUM_CLIENTS_UPDATE(u34)メッセージも送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u18</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room IDまたは、Room修飾子</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>RoomManager.getNumClientsInRooms()</li>
<li>Room.synchronizeClientCount()</li>
<li>Server.getNumClientsOnServer()</li>
</ul>
</dd>
</dl>
<h5>SYNC_TIME</h5>
<p>Union Serverに対して、現在の時刻の送信を要求します。Union ServerはSERVER_TIME_UPDATE(u50)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u19</dd>
<dt>引数</dt>
<dd>
<ul>
<li>なし</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Server.syncTime()</li>
</ul>
</dd>
</dl>
<h5>GET_ROOM_LIST</h5>
<p>Union Serverに対して、指定したRoomのリストの取得を要求します。Union ServerはROOM_LIST_UPDATE(u38)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u21</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room 修飾子</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>RoomManager.getRoomListFromServer()</li>
</ul>
</dd>
</dl>
<h5>CREATE_ROOM</h5>
<p>Union Serverに対して、指定したRoom IDのRoom作成を要求します。Union Serverは要求の結果をROOM_ADDED(u39)メッセージで送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u24</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Tokens.RS区切りのRoom Settings項目リスト</li>
<li>Tokens.RS区切りのRoom Attribute項目リスト</li>
<li>Tokens.RS区切りのRooom Module ClassまたはScriptリスト</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>RoomManager.createRoom()</li>
</ul>
</dd>
</dl>
<h5>REMOVE_ROOM</h5>
<p>Union Serverに対して、指定したRoom IDのRoom削除を要求します。Union Serverは要求の結果を、このメッセージを送信したClientに対して、REMOVE_ROOM_RESULT(u33)メッセージを送信します。Union Serverは要求の結果をRoom内の全クライアントにROOM_REMOVED(u40)メッセージで送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u25</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Room パスワード</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>RoomManager.removeRoom()</li>
</ul>
</dd>
</dl>
<h5>WATCH_FOR_ROOMS</h5>
<p>Union Serverに対して、指定したRoom 修飾子のRoomが追加、削除された際の通知を要求します。Union Serverは要求の結果をWATCH_FOR_ROOMS_RESULT(u42)メッセージで送信します。その際、1つでも一致するRoomが存在すれば、Union ServerはROOM_LIST_UPDATE(u38)メッセージを送信します。</p>
<p>引き続き、Union Serverは修飾子に一致するRoomが追加されれば、ROOM_ADDED(u39)メッセージを送信します。削除されえば、ROOM_REMOVED(u40)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u26</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room 修飾子</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>RoomManager.watchForRooms()</li>
</ul>
</dd>
</dl>
<h5>STOP_WATCHING_FOR_ROOMS</h5>
<p>Union Serverに対して、指定したRoom 修飾子のRoomが追加、削除された際の通知停止を要求します。Union Serverは要求の結果をSTOP_WATCHING_FOR_ROOMS_RESULT(u43)メッセージで送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u27</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room 修飾子</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>RoomManager.stopWatchingForRooms()</li>
</ul>
</dd>
</dl>
<h5>SYNC_ROOM</h5>
<p>Union Serverに対して、指定したRoomのスナップショットを要求します。Union Serverは要求の結果をSYNC_ROOM_RESULT(u60)メッセージで送信します。成功した場合、Union ServerはROOM_SNAPSHOT(u54)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u55</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Room パスワード</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Room.synchronize()</li>
<li>RoomManager.synchronizeRoom()</li>
</ul>
</dd>
</dl>
<h5>OBSERVE_ROOM</h5>
<p>Union Serverに対して、指定したRoomへのobserveを要求します。Union Serverは要求の結果をOBSERVE_ROOM_RESULT(u77)メッセージで送信します。成功した場合、Union ServerはOBSERVED_ROOM(u59)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u58</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Room パスワード</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Room.observe()</li>
<li>RoomManager.observeRoom()</li>
</ul>
</dd>
</dl>
<h5>STOP_OBSERVING_ROOM</h5>
<p>Union Serverに対して、指定したRoomへのobserve停止を要求します。Union Serverは要求の結果をSTOP_OBSERVING_ROOM_RESULT(u78)メッセージで送信します。成功した場合、Union ServerはJOIN_ROOM_RESULT(u62)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u61</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Room.stopObserving()</li>
<li>RoomManager.stopObservingRoom()</li>
</ul>
</dd>
</dl>
<h5>SET_ROOM_UPDATE_LEVELS</h5>
<p>Union Serverに対して、指定したRoom内での更新通知レベル設定を要求します。</p>
<dl>
<dt>内部コード</dt>
<dd>u64</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Tokens.RS区切りの入室者更新レベル, Room更新レベル, Message更新レベル</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Room.setUpdateLevels()</li>
<li>Room.join()</li>
<li>Room.observe()</li>
<li>RoomManager.joinRoom()</li>
<li>RoomManager.observeRoom()</li>
</ul>
</dd>
</dl>
<h5>CLIENT_HELLO</h5>
<p>Union Serverに対して、コネクションを要求します。Union Serverは、SERVER_HELLO(u66)メッセージを送信します。要求が成功した場合、Union Serverは、CLIENT_METADATA(u29)、CLIENT_READY(u63)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u65</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Client タイプ</li>
<li>ユーザーエージェント</li>
<li>UPCバージョン</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>ReactorEvent.PROTOCOL_INCOMPATIBLE.</li>
</ul>
</dd>
</dl>
<h5>REMOVE_ROOM_ATTR</h5>
<p>Union Serverに対して、指定したRoomのRoom Attributeの削除を要求します。Union Serverは要求の結果を、REMOVE_ROOM_ATTR_RESULT(u80)メッセージで送信します。要求が成功した場合、Union ServerはROOM_ATTR_REMOVED(u79)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u67</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Room Attribute名</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Room.deleteAttribute()</li>
</ul>
</dd>
</dl>
<h5>REMOVE_CLIENT_ATTR</h5>
<p>Union Serverに対して、Client Attributeの削除を要求します。Union Serverは要求の結果を、REMOVE_CLIENT_ATTR_RESULT(u82)メッセージで送信します。要求が成功した場合、Union ServerはCLIENT_ATTR_REMOVED(u81)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u69</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Client ID</li>
<li>Client Attribute名</li>
<li>Client Attributeスコープ</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Client.deleteAttribute()</li>
</ul>
</dd>
</dl>
<h5>SEND_ROOMMODULE_MESSAGE</h5>
<p>Union Serverに対して、指定したRoomにモジュールメッセージ識別子で指定したモジュールメッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u70</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>モジュールメッセージ識別子</li>
<li>モジュールメッセージ引数(以降、複数指定可能)</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Room.sendModuleMessage()</li>
</ul>
</dd>
</dl>
<h5>SEND_SERVERMODULE_MESSAGE</h5>
<p>Union Serverに対して、指定したモジュールにモジュールメッセージ識別子で指定したモジュールメッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u71</dd>
<dt>引数</dt>
<dd>
<ul>
<li>モジュール ID</li>
<li>モジュールメッセージ識別子</li>
<li>モジュールメッセージ引数(以降、複数指定可能)</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Server.sendModuleMessage()</li>
</ul>
</dd>
</dl>
<h4>Union ServerからReactorへ送信されるメッセージ</h4>
<h5>JOINED_ROOM</h5>
<p>Clientがjoinしたroomの情報を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u6</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
</ul>
</dd>
</dl>
<h5>RECEIVE_MESSAGE</h5>
<p>Messageを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u7</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Message識別子</li>
<li>ブロードキャストタイプ</li>
<li>送信元Client ID(Union Serverが送信元の場合は空)</li>
<li>送信先Room ID</li>
<li>sendMessageの引数(以降、複数指定可能)</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>MessageManager.addMessageListener() (直接ではない)</li>
<li>Room.addMessageListener() (直接ではない)</li>
</ul>
</dd>
</dl>
<h6>ブロードキャストタイプ</h6>
<table class="data_table">
<caption>ブロードキャストタイプ</caption>
<thead>
<tr>
<th>値</th>
<th>意味</th>
<th>受け取るClient</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>サーバー宛</td>
<td>全Client</td>
</tr>
<tr>
<td>1</td>
<td>ルーム宛</td>
<td>指定Room全Client</td>
</tr>
<tr>
<td>2</td>
<td>クライアント宛</td>
<td>指定Client</td>
</tr>
</tbody>
</table>
<h5>CLIENT_ATTR_UPDATE</h5>
<p>Client Attributeの更新を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u8</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Client ID</li>
<li>Client Attribute名</li>
<li>Client Attribute値</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.UPDATE_CLIENT_ATTRIBUTE</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul></ul>
</dd>
</dl>
<h5>ROOM_ATTR_UPDATE</h5>
<dl>
<dt>内部コード</dt>
<dd>u9</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Client ID(Union Serverが更新元の場合は空)</li>
<li>Room Attribute名</li>
<li>Room Attribute値</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.UPDATE_ROOM_ATTRIBUTE</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul></ul>
</dd>
</dl>
<h5>CLIENT_METADATA</h5>
<p>接続元Clientへ初期情報を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u29</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Client ID</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>なし(UPCが内部的に処理します)</li>
</ul>
</dd>
</dl>
<h5>CREATE_ROOM_RESULT</h5>
<p>ClientのRoom作成試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u32</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomManagerEvent.CREATE_ROOM_RESULT</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>ROOM_EXISTS</li>
</ul>
</dd>
</dl>
<h5>REMOVE_ROOM_RESULT</h5>
<p>ClientのRoom削除試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u33</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomManagerEvent.REMOVE_ROOM_RESULT</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>ROOM_NOT_FOUND</li>
<li>AUTHORIZATION_REQUIRED</li>
<li>AUTHORIZATION_FAILED</li>
</ul>
</dd>
</dl>
<h5>NUM_CLIENTS_UPDATE</h5>
<p>特定のスコープ内RoomのClient数を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u34</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Roomのスコープ</li>
<li>総Client数</li>
<li>ユニークClient数</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.CLIENT_COUNT</li>
<li>RoomManagerEvent.CLIENT_COUNT</li>
<li>ServerEvent.CLIENT_COUNT</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li></li>
</ul>
</dd>
</dl>
<h5>CLIENT_ADDED</h5>
<p>ClientがRoomにjoinしたことを通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u36</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Client ID</li>
<li>Tokens.RS区切りのグローバルClient Attribute</li>
<li>Tokens.RS区切りのRoomスコープ Client Attribute</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.ADD_CLIENT</li>
</ul>
</dd>
</dl>
<h5>CLIENT_REMOVED</h5>
<p>ClientがRoomからleaveしたことを通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u37</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Client ID</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.REMOVE_CLIENT</li>
</ul>
</dd>
</dl>
<h5>ROOM_LIST_UPDATE</h5>
<p>特定のRoomスコープのRoom一覧の更新を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u38</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Roomスコープ</li>
<li>Room ID(以降、複数指定可能)</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomManagerEvent.ROOM_ADDED</li>
<li>RoomManagerEvent.ROOM_REMOVED</li>
</ul>
</dd>
</dl>
<h5>ROOM_ADDED</h5>
<p>特定のRoomが追加されたことを通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u39</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomManagerEvent.ROOM_ADDED</li>
</ul>
</dd>
</dl>
<h5>ROOM_REMOVED</h5>
<p>特定のRoomが削除されたことを通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u40</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomManagerEvent.ROOM_REMOVED</li>
</ul>
</dd>
</dl>
<h5>WATCH_FOR_ROOMS_RESULT</h5>
<p>ClientのWATCH_FOR_ROOMS試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u42</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID修飾子</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomManagerEvent.WATCH_FOR_ROOMS_RESULT</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>INVALID_QUALIFIER</li>
<li>ALREADY_WATCHING</li>
</ul>
</dd>
</dl>
<h5>STOP_WATCHING_FOR_ROOMS_RESULT</h5>
<p>ClientのSTOP_WATCHING_FOR_ROOMS試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u43</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID修飾子</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomManagerEvent.STOP_WATCHING_FOR_ROOMS_RESULT</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>INVALID_QUALIFIER</li>
<li>NOT_WATCHING_QUALIFIER</li>
</ul>
</dd>
</dl>
<h5>LEFT_ROOM</h5>
<p>ClientがRoomからleaveしたことを通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u44</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.LEAVE</li>
</ul>
</dd>
</dl>
<h5>CHANGE_PERSISTENT_CLIENT_RESULT</h5>
<p>Clientの永続化Clientパスワード変更試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u46</dd>
<dt>引数</dt>
<dd>
<ul>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>PersistenceEvent.CHANGED</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>NAME_NOT_FOUND</li>
<li>AUTHORIZATION_FAILED</li>
</ul>
</dd>
</dl>
<h5>CREATE_PERSISTENT_CLIENT_RESULT</h5>
<p>Clientの永続化Client登録試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u47</dd>
<dt>引数</dt>
<dd>
<ul>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>PersistenceEvent.CREATED</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>NAME_EXISTS</li>
</ul>
</dd>
</dl>
<h5>REMOVE_PERSISTENT_CLIENT_RESULT</h5>
<p>Clientの永続化Client削除試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u48</dd>
<dt>引数</dt>
<dd>
<ul>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>PersistenceEvent.REMOVED</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>NAME_NOT_FOUND</li>
<li>AUTHORIZATION_FAILED</li>
</ul>
</dd>
</dl>
<h5>LOGIN_CLIENT_RESULT</h5>
<p>Clientの永続化Clientログイン試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u49</dd>
<dt>引数</dt>
<dd>
<ul>
<li>ステータス</li>
<li>Tokens.RS区切りのClient Attribute(以降、複数指定可能)</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>PersistenceEvent.LOGIN</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>ALREADY_LOGGED_IN</li>
<li>AUTHORIZATION_FAILED</li>
</ul>
</dd>
</dl>
<h5>SERVER_TIME_UPDATE</h5>
<p>Union Serverの現在の時刻を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u50</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Union Serverの時刻</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>ServerEvent.TIME_SYNC</li>
</ul>
</dd>
</dl>
<h5>ROOM_SNAPSHOT</h5>
<p>RoomのRoom AttributeやClientなどの状態を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u54</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Tokens.RS区切りのRoom Attribute</li>
<li>Client ID</li>
<li>Client グローバルCleint Attribute</li>
<li>Client RoomスコープCleint Attribute</li>
<li>以降、Client ID, Client グローバルCleint Attribute, Client RoomスコープCleint Attributeの組で複数指定可能)</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>Room.synchronize()</li>
<li>RoomEvent.SYNCHRONIZE</li>
<li>Room.join()</li>
<li>Room.observe()</li>
</ul>
</dd>
</dl>
<h5>OBSERVED_ROOM</h5>
<p>ClientがRoomをobserveしたことを通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u59</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.OBSERVE</li>
</ul>
</dd>
</dl>
<h5>SYNC_ROOM_RESULT</h5>
<p>ClientのSYNC_ROOM試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u60</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.SYNCHRONIZE</li>
<li>RoomManagerEvent.SYNC_NONEXISTENT_ROOM</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>ROOM_NOT_FOUND</li>
<li>AUTHORIZATION_REQUIRED</li>
<li>AUTHORIZATION_FAILED</li>
<li>ALREADY_SYNCHRONIZED</li>
</ul>
</dd>
</dl>
<h5>STOPPED_OBSERVING_ROOM</h5>
<p>ClientがRoomのobserveを停止したことを通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u62</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.STOP_OBSERVING</li>
</ul>
</dd>
</dl>
<h5>CLIENT_READY</h5>
<p>Clientの初期化処理が完了し準備が出来たことを通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u63</dd>
<dt>引数</dt>
<dd>
<ul>
<li>なし</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>UConnectionEvent.READY</li>
</ul>
</dd>
</dl>
<h5>SERVER_HELLO</h5>
<p>ClientにUnion ServerやUPCプロトコルの情報を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u66</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Union Serverバージョン</li>
<li>セッションID</li>
<li>UPCバージョン</li>
<li>Clientとのプロトコル互換</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>Union Serverバージョン</li>
<li>セッションID</li>
<li>UPCバージョン</li>
<li>protocolCompatible</li>
</ul>
</dd>
</dl>
<h5>JOIN_ROOM_RESULT</h5>
<p>Clientのjoin試行の結果を通知する。</p>
<dl>
<dt>内部コード</dt>
<dd>u72</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.JOIN_RESULT</li>
<li>RoomManagerEvent.JOIN_NONEXISTENT_ROOM
<li>
		</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>ALREADY_IN_ROOM</li>
<li>ROOM_NOT_FOUND</li>
<li>ROOM_FULL</li>
<li>AUTHORIZATION_REQUIRED</li>
<li>AUTHORIZATION_FAILED</li>
</ul>
</dd>
</dl>
<h5>SET_CLIENT_ATTR_RESULT</h5>
<p>Client Attribute更新試行の結果</p>
<dl>
<dt>内部コード</dt>
<dd>u73</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Client ID</li>
<li>Client Attribute名</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.SET_CLIENT_ATTRIBUTE_RESULT</li>
<li>ClientEvent.SET_ATTRIBUTE_RESULT
<li>
		</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>DUPLICATE_VALUE</li>
<li>CLIENT_NOT_FOUND</li>
<li>IMMUTABLE</li>
<li>SERVER_ONLY</li>
<li>EVALUATION_FAILED</li>
</ul>
</dd>
</dl>
<h5>SET_ROOM_ATTR_RESULT</h5>
<p>Room Attribute更新試行の結果</p>
<dl>
<dt>内部コード</dt>
<dd>u74</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Room Attribute名</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.SET_ROOM_ATTRIBUTE_RESULT
<li>
		</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>IMMUTABLE</li>
<li>SERVER_ONLY</li>
<li>EVALUATION_FAILED</li>
</ul>
</dd>
</dl>
<h5>GET_NUM_CLIENTS_RESULT</h5>
<p>Clientの数を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u75</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room スコープ</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.GET_NUM_CLIENTS_RESULT
<li>
<li>RoomManagerEvent.GET_NUM_CLIENTS_RESULT</li>
<li>ServerEvent.GET_NUM_CLIENTS_RESULT</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>ROOM_NOT_FOUND</li>
</ul>
</dd>
</dl>
<h5>LEAVE_ROOM_RESULT</h5>
<p>特定のRoomへのClientのleave試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u76</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.LEAVE_RESULT</li>
<li>RoomManagerEvent.LEAVE_NONEXISTENT_ROOM</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>NOT_IN_ROOM</li>
<li>ROOM_NOT_FOUND</li>
</ul>
</dd>
</dl>
<h5>OBSERVE_ROOM_RESULT</h5>
<p>特定のRoomへのClientのobserve試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u77</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.OBSERVE_RESULT</li>
<li>RoomManagerEvent.OBSERVE_NONEXISTENT_ROOM</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>ROOM_NOT_FOUND</li>
<li>AUTHORIZATION_REQUIRED</li>
<li>AUTHORIZATION_FAILED</li>
<li>ALREADY_OBSERVING</li>
</ul>
</dd>
</dl>
<h5>STOP_OBSERVING_ROOM_RESULT</h5>
<p>特定のRoomへのClientのobserve停止試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u78</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.STOP_OBSERVING</li>
<li>RoomManagerEvent.STOP_OBSERVING_NONEXISTENT_ROOM</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>ROOM_NOT_FOUND</li>
<li>NOT_OBSERVING</li>
</ul>
</dd>
</dl>
<h5>ROOM_ATTR_REMOVED</h5>
<p>Room Attributeの削除を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u79/dd></p>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Client ID</li>
<li>Room Attribute名</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.DELETE_ROOM_ATTRIBUTE</li>
</ul>
</dd>
</dl>
<h5>REMOVE_ROOM_ATTR_RESULT</h5>
<p>Room Attributeの削除試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u80</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Room Attribute名</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.DELETE_ROOM_ATTRIBUTE_RESULT</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>IMMUTABLE</li>
<li>SERVER_ONLY</li>
<li>ROOM_NOT_FOUND</li>
<li>ATTR_NOT_FOUND</li>
</ul>
</dd>
</dl>
<h5>CLIENT_ATTR_REMOVED</h5>
<p>Client Attributeの削除を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u81</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Client ID</li>
<li>Client Attribute名</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.DELETE_CLIENT_ATTRIBUTE</li>
</ul>
</dd>
</dl>
<h5>REMOVE_CLIENT_ATTR_RESULT</h5>
<p>Client Attributeの削除試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u82</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Client ID</li>
<li>Client Attribute名</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.DELETE_ROOM_ATTRIBUTE_RESULT</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>CLIENT_NOT_FOUND</li>
<li>IMMUTABLE</li>
<li>SERVER_ONLY</li>
<li>ATTR_NOT_FOUND</li>
</ul>
</dd>
</dl>
<h3>まとめ</h3>
<p>UPCはUnionを使った開発で直接扱いませんが、ReactorのデバッグログやUnion Serverのログに出力されます。興味がある方はUPCのログを眺めて見てください。</p>
]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/490/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Union Platform alpha4 released</title>
		<link>http://fla.la/archives/478</link>
		<comments>http://fla.la/archives/478#comments</comments>
		<pubDate>Mon, 07 Sep 2009 01:18:52 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[Union Platform]]></category>

		<guid isPermaLink="false">http://fla.la/?p=478</guid>
		<description><![CDATA[Union alpha4がリリースされたので使ってみました。 tryunion.comを使われている方は、Reactorの更新が必要です。自身でUnion Serverを用意している方はReactor、Union Serverの両方を更新しましょう。 リリースノートは以下から確認出来ます。 Union 1.0 Alpha4 Release Notes なお、以前のalpha3向けのエントリーは更新する予定です。完了しましたら別途お知らせいたします。 では、変更された点を確認してみます。 UPC仕様の更新 ReactorとUnion Serverとのやりとりで利用されているUPCの仕様が変更されたようです。 詳しくは、UPC変更点を参照して下さい。 ReactorのAPI ClientクラスのgetAttributeメソッドの引数指定の変更と、細かなバグフィックスが行われたようです。 Reactorドキュメント 主に、以下のクラスのドキュメントが更新されています。 net.user1.reactor.Client net.user1.reactor.ClientEvent net.user1.reactor.ClientManager net.user1.reactor.Reactor net.user1.reactor.ReactorEvent net.user1.reactor.RoomEvent net.user1.reactor.Tokens net.user1.reactor.UPC net.user1.reactor.Validator ここに挙げたクラスのドキュメント以外にも、文言の微調整がいくつかされているようです。 APIの変更 net.user1.reactor.ClientクラスのgetAttributeメソッド 引数の順番が変更になりました。 alpha3 // グローバルスコープ client.getAttribute&#40;null, &#34;attributeKey&#34;&#41;; &#160; // 特定のRoomスコープ client.getAttribute&#40;&#34;roomID&#34;, &#34;attributeKey&#34;&#41;; alpha4 // グローバルスコープ client.getAttribute&#40;&#34;attributeKey&#34;&#41;; &#160; // 特定のRoomスコープ client.getAttribute&#40;&#34;attributeKey&#34;, &#34;roomID&#34;&#41;; net.user1.reactor.ClientManagerのgetAttributeForClientsメソッド ClientクラスのgetAttributeメソッドと同様に、引数の順番が変更となりました。 [...]]]></description>
			<content:encoded><![CDATA[<p>Union alpha4がリリースされたので使ってみました。<br />
tryunion.comを使われている方は、Reactorの更新が必要です。自身でUnion Serverを用意している方はReactor、Union Serverの両方を更新しましょう。</p>
<p>リリースノートは以下から確認出来ます。<br />
<a href="http://www.unionplatform.com/?page_id=729">Union 1.0 Alpha4 Release Notes</a></p>
<p>なお、以前のalpha3向けのエントリーは更新する予定です。完了しましたら別途お知らせいたします。</p>
<p>では、変更された点を確認してみます。</p>
<p><span id="more-478"></span></p>
<h3>UPC仕様の更新</h3>
<p>ReactorとUnion Serverとのやりとりで利用されているUPCの仕様が変更されたようです。</p>
<p>詳しくは、<a href="http://factory.user1.net/issues/show/88">UPC変更点</a>を参照して下さい。</p>
<h3>ReactorのAPI</h3>
<p>ClientクラスのgetAttributeメソッドの引数指定の変更と、細かなバグフィックスが行われたようです。</p>
<h4>Reactorドキュメント</h4>
<p>主に、以下のクラスのドキュメントが更新されています。</p>
<ul>
<li>net.user1.reactor.Client</li>
<li>net.user1.reactor.ClientEvent</li>
<li>net.user1.reactor.ClientManager</li>
<li>net.user1.reactor.Reactor</li>
<li>net.user1.reactor.ReactorEvent</li>
<li>net.user1.reactor.RoomEvent</li>
<li>net.user1.reactor.Tokens</li>
<li>net.user1.reactor.UPC</li>
<li>net.user1.reactor.Validator</li>
</ul>
<p>ここに挙げたクラスのドキュメント以外にも、文言の微調整がいくつかされているようです。</p>
<h4>APIの変更</h4>
<h5>net.user1.reactor.ClientクラスのgetAttributeメソッド</h5>
<p>引数の順番が変更になりました。</p>
<h6>alpha3</h6>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #009900;">// グローバルスコープ</span>
<span style="color: #004993;">client</span>.getAttribute<span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">null</span>, <span style="color: #990000;">&quot;attributeKey&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #009900;">// 特定のRoomスコープ</span>
<span style="color: #004993;">client</span>.getAttribute<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;roomID&quot;</span>, <span style="color: #990000;">&quot;attributeKey&quot;</span><span style="color: #000000;">&#41;</span>;</pre></div></div>

<h6>alpha4</h6>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #009900;">// グローバルスコープ</span>
<span style="color: #004993;">client</span>.getAttribute<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;attributeKey&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #009900;">// 特定のRoomスコープ</span>
<span style="color: #004993;">client</span>.getAttribute<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;attributeKey&quot;</span>, <span style="color: #990000;">&quot;roomID&quot;</span><span style="color: #000000;">&#41;</span>;</pre></div></div>

<h5>net.user1.reactor.ClientManagerのgetAttributeForClientsメソッド</h5>
<p>ClientクラスのgetAttributeメソッドと同様に、引数の順番が変更となりました。</p>
<h5>net.user1.reactor.RoomEventの定数</h5>
<p>UPCの仕様変更に伴い、RoomEventの定数が増えています。</p>
<h3>Union Server</h3>
<p>policy.htmlを更新した際に、ポリシーが自動で更新されるようになりました。その他バグフィックスが行われたようです。</p>
<h4>クラスの追加</h4>
<p>docs/javadocの下を見る限り以下のクラスが追加されたようです。</p>
<ul>
<li>net.user1.union.core.connection.Connection</li>
<li>net.user1.union.core.def.ConnectionFilterDef</li>
<li>net.user1.union.api.Reauest</li>
</ul>
<h4>Union Server起動時の挙動</h4>
<p>windows環境で、startserver.batを実行すると、今まではコマンドプロンプトが開いてログも表示されていたのですが、表示されなくなりました。管理用ツール(UnionAdmin.swf)で見れるようになったので表示されなくなったようです。</p>
<p>その他の更新は、<a href="http://factory.user1.net/versions/show/19">Union Server変更点</a>を参照して下さい。</p>
<h3>管理ツール(UnionAdmin.swf)</h3>
<p>前述の通り、Union Serverのログを確認できるようになりました。FMS管理コンソールと似てきましたね。正直alpha3まではあまり使っていなかったのですが、Roomの情報も細かく見れるようになったりバグが修正されたようなので、これからは使ってみようと思います。</p>
<p>その他の更新は、<a href="http://factory.user1.net/versions/show/21">管理ツール(UnionAdmin.swf)変更点</a>を参照して下さい。</p>
<h3>その他の更新</h3>
<p>@keno42さんからの情報です。ClientクラスのsetAttribute()メソッド実行時に、自身のClient Attributeの更新通知は即時反映されるようになりました。</p>
<p>以下のサンプルで試した見たのですが、tryunion.comに接続した状態で、自身のClient Attribute更新時は15msec程度でした。別ClientのClient Attribute更新時は、状況によりりますが100msec以上かかるようです。</p>
<div style="text-align:center;width:465px;"><iframe title="Client Attributeの応答時間テスト - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/cc689fc0a5451b093d90d8f47ab825dfc39d7630" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/code/cc689fc0a5451b093d90d8f47ab825dfc39d7630" title="Client Attributeの応答時間テスト - wonderfl build flash online">Client Attributeの応答時間テスト &#8211; wonderfl build flash online</a></div>
<p>自身のClient Attributeの更新も他のクライアントと同様のレスポンスを期待する場合には、ClientクラスのsetAttribute()メソッド実行時のevaluateオプションをtrueにすると、サーバでの処理が走るので強制的にUnion Server経由で更新が通信されるようになるそうです。</p>
<h3>wonderflの投稿</h3>
<p><a href="http://wonderfl.net/blog/2009/09/library-updates-and-checkmate-vol3.html">wonderflのUnionライブラリもalpha4に更新された</a>ようですので、Unionライブラリを使っている投稿は最コンパイルする必要があります。</p>
<p>また、私の以下の2つの投稿では、ClientメソッドのgetAttributeメソッドを使用しておりましたので引数の修正を行いました。</p>
<ul>
<li><a href="http://wonderfl.net/code/b65e9bddc8c1307ab1ea068414612dad1f6ad093">Union Platform avatar chat forked from: colin challenge for professionals</a></li>
<li><a href="http://wonderfl.net/code/d65724b1c2c161a9bc77b435951d381921961eb9">Unionチャットサンプル</a></li>
</ul>
<h3>まとめ</h3>
<p>私がUnionライブラリを本格的に使い始めたのはalpha3からでしたので、初めてのアップデートでした。プロダクトのアップデートは大変ワクワクしますね。Derek Claytonさん、Colin Moockさんありがとうございます。</p>
]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/478/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Union Platform(8) Moduleサンプル</title>
		<link>http://fla.la/archives/369</link>
		<comments>http://fla.la/archives/369#comments</comments>
		<pubDate>Sat, 05 Sep 2009 13:39:48 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[Union Platform]]></category>
		<category><![CDATA[server java eclipse twitter twitter4j]]></category>

		<guid isPermaLink="false">http://fla.la/?p=369</guid>
		<description><![CDATA[本エントリーではModule作成の例としてRoomModuleの作成を紹介します。UnionのバージョンはUnion alpha3を使用します。Union alpha4での動作も確認済みです。 作成するRoom Moduleの概要 ReactorからtwitというModule Messageを送信すると、Union Serverがtwitterにtwitするという機能を作ってみます。 Reactorから今回作成するRoom Moduleが動作するRoomへ接続する RoomインスタンスのsendModuleMessage()メソッドからtwitというModule Messageを送信 Room Moduleは受け取ったModule Messageをtwitterに投稿する Room Moduleの大枠の作成 com.asmple.server.union.module.roomパッケージ内にTwitModuleSampleというクラスを作成します。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package com.asmple.server.union.module.room; &#160; import net.user1.union.core.context.ModuleContext; &#160; public class TwitModuleSample implements Module &#123; &#160; @Override public boolean init&#40;ModuleContext ctx&#41; &#123; [...]]]></description>
			<content:encoded><![CDATA[<p>本エントリーではModule作成の例としてRoomModuleの作成を紹介します。UnionのバージョンはUnion alpha3を使用します。Union alpha4での動作も確認済みです。</p>
<h3>作成するRoom Moduleの概要</h3>
<p>ReactorからtwitというModule Messageを送信すると、Union Serverがtwitterにtwitするという機能を作ってみます。</p>
<ul>
<li>Reactorから今回作成するRoom Moduleが動作するRoomへ接続する</li>
<li>RoomインスタンスのsendModuleMessage()メソッドからtwitというModule Messageを送信</li>
<li>Room Moduleは受け取ったModule Messageをtwitterに投稿する</li>
</ul>
<p><span id="more-369"></span></p>
<h3>Room Moduleの大枠の作成</h3>
<p>com.asmple.server.union.module.roomパッケージ内にTwitModuleSampleというクラスを作成します。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.asmple.server.union.module.room</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">net.user1.union.core.context.ModuleContext</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TwitModuleSample <span style="color: #000000; font-weight: bold;">implements</span> Module <span style="color: #009900;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> init<span style="color: #009900;">&#40;</span>ModuleContext ctx<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> shutdown<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// TODO Auto-generated method stub</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h3>Module Messageのイベントをハンドリングする</h3>
<p>Module Messageのイベントハンドリング機能を追加するしたものが下記です。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.asmple.server.union.module.room</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Map</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">net.user1.union.api.Message</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">net.user1.union.api.Module</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">net.user1.union.core.context.ModuleContext</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">net.user1.union.core.event.RoomEvent</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TwitModuleSample <span style="color: #000000; font-weight: bold;">implements</span> Module <span style="color: #009900;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> init<span style="color: #009900;">&#40;</span>ModuleContext ctx<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// Room Module Messageを受信した際のイベントを監視</span>
		ctx.<span style="color: #006633;">getRoom</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">addEventListener</span><span style="color: #009900;">&#40;</span>RoomEvent.<span style="color: #006633;">MODULE_MESSAGE</span>, <span style="color: #000000; font-weight: bold;">this</span>, <span style="color: #0000ff;">&quot;onModuleMessage&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Module Message受信時に実行されるメソッド
	 * @param evt
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onModuleMessage<span style="color: #009900;">&#40;</span>RoomEvent evt<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		Message message <span style="color: #339933;">=</span> evt.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Map<span style="color: #339933;">&lt;</span>String, String<span style="color: #339933;">&gt;</span> params <span style="color: #339933;">=</span> message.<span style="color: #006633;">getArgs</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// Module Message名を確認</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>message.<span style="color: #006633;">getMessageName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;twit&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// 引数オブジェクトからtextプロパティを取得する</span>
			<span style="color: #003399;">String</span> text <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#41;</span>params.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;text&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> shutdown<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// TODO Auto-generated method stub</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h4>Module Messageイベントを監視</h4>
<p>リスナー登録はこのように行います。AS3と似た構文で記述可能です。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>15
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">		ctx.<span style="color: #006633;">getRoom</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">addEventListener</span><span style="color: #009900;">&#40;</span>RoomEvent.<span style="color: #006633;">MODULE_MESSAGE</span>, <span style="color: #000000; font-weight: bold;">this</span>, <span style="color: #0000ff;">&quot;onModuleMessage&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h4>onModuleMessageハンドラ</h4>
<p>ハンドラ内でメッセージの名前を確認し、引数のオブジェクトを取得します。これらの値を使ってtwitterと連携すれば良さそうですね。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onModuleMessage<span style="color: #009900;">&#40;</span>RoomEvent evt<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		Message message <span style="color: #339933;">=</span> evt.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Map<span style="color: #339933;">&lt;</span>String, String<span style="color: #339933;">&gt;</span> params <span style="color: #339933;">=</span> message.<span style="color: #006633;">getArgs</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// Module Message名を確認</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>message.<span style="color: #006633;">getMessageName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;twit&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// 引数オブジェクトからtextプロパティを取得する</span>
			<span style="color: #003399;">String</span> text <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#41;</span>params.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;text&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h3>Twitterに投稿する機能を追加する準備</h3>
<p>twitterのアカウントをお持ちでない方は、twitterアカウントのidとpasswordを用意してください。</p>
<h4>twitter4jの導入</h4>
<p><a href="http://yusuke.homeip.net/twitter4j/ja/index.html">Twitter4J</a>からtwitter4j-2.0.9.zipをダウンロードしてきます。</p>
<p>アーカイブを解凍したら、twitter4j-2.0.9.jarをUnion Serverをインストールしたディレクトリのlib配下へコピーします。</p>
<h4>eclipseのライブラリパスを設定</h4>

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_0" width="512" height="312" align="center">
      <param name="movie" value="http://fla.la/wp-content/uploads/2009/09/union_platform008_001.swf?startingPlaybackMode=1" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fla.la/wp-content/uploads/2009/09/union_platform008_001.swf?startingPlaybackMode=1" width="512" height="312" align="center">
      <!--<![endif]-->
        ライブラリパスに.jarを追加する
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>

<ol>
<li>Package Explorerでunion_platform(プロジェクト名)からコンテキストメニューを表示します。</li>
<li>Propertiesを選択します。</li>
<li>JAVA Build PathからLibrariesタブを選択します。</li>
<li>Add JARsボタンをクリックします。</li>
<li>先ほど追加したlib/twitter4j-2.0.9.jarを選択します。</li>
</ol>
<h4>startup.bat(.sh)の編集</h4>
<p>前回のstartup.bat(.sh)に追記していきます。前回の記事をお読みでない方は、<a href="http://fla.la/archives/365">Union Platform(7) Union Server Module作成準備</a>を参照して下さい。</p>
<p>Windows環境の場合はstartup.batを編集します。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">java <span style="color: #660033;">-cp</span> lib\union.jar;lib\stax-api-1.0.1.jar;lib\wstx-asl-3.2.6.jar;lib\com-asmple-server-union-module.jar net.user1.union.core.UnionMain start</pre></div></div>

<p>;lib\com-asmple-server-union-module.jarの後ろに以下を追記します。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">;lib\twitter4j-2.0.9.jar</pre></div></div>

<p>変更後は以下のようになります。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">java <span style="color: #660033;">-cp</span> lib\union.jar;lib\stax-api-1.0.1.jar;lib\wstx-asl-3.2.6.jar;lib\com-asmple-server-union-module.jar;lib\twitter4j-2.0.9.jar net.user1.union.core.UnionMain start</pre></div></div>

<p>Mac OS X, Linux環境の場合はstartup.shを編集します。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
java <span style="color: #660033;">-cp</span> lib<span style="color: #000000; font-weight: bold;">/</span>union.jar:lib<span style="color: #000000; font-weight: bold;">/</span>stax-api-1.0.1.jar:lib<span style="color: #000000; font-weight: bold;">/</span>wstx-asl-3.2.6.jar:lib<span style="color: #000000; font-weight: bold;">/</span>com-asmple-server-union-module.jar net.user1.union.core.UnionMain start <span style="color: #000000; font-weight: bold;">&amp;</span></pre></div></div>

<p>lib/com-asmple-server-union-module.jarの後ろに以下を追記します。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">:lib<span style="color: #000000; font-weight: bold;">/</span>twitter4j-2.0.9.jar</pre></div></div>

<p>変更後は以下のようになります。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
java <span style="color: #660033;">-cp</span> lib<span style="color: #000000; font-weight: bold;">/</span>union.jar:lib<span style="color: #000000; font-weight: bold;">/</span>stax-api-1.0.1.jar:lib<span style="color: #000000; font-weight: bold;">/</span>wstx-asl-3.2.6.jar:lib<span style="color: #000000; font-weight: bold;">/</span>com-asmple-server-union-module.jar:lib<span style="color: #000000; font-weight: bold;">/</span>twitter4j-2.0.9.jar net.user1.union.core.UnionMain start <span style="color: #000000; font-weight: bold;">&amp;</span></pre></div></div>

<h3>Twitter4Jを組み込む</h3>
<p>実際にTwitter4Jを組み込んだものが以下のコードです。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.asmple.server.union.module.room</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.net.URLDecoder</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Map</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">twitter4j.Status</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">twitter4j.Twitter</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">net.user1.union.api.Message</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">net.user1.union.api.Module</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">net.user1.union.core.context.ModuleContext</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">net.user1.union.core.event.RoomEvent</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TwitModuleSample <span style="color: #000000; font-weight: bold;">implements</span> Module <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> Twitter twitter<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// twitterのidを設定</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> TWITTER_ID <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;your twitter id&quot;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// twitterのpassowrdを設定</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> TWITTER_PW <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;your twitter password&quot;</span><span style="color: #339933;">;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> init<span style="color: #009900;">&#40;</span>ModuleContext ctx<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// Room Module Messageを受信した際のイベントを監視</span>
		ctx.<span style="color: #006633;">getRoom</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">addEventListener</span><span style="color: #009900;">&#40;</span>RoomEvent.<span style="color: #006633;">MODULE_MESSAGE</span>, <span style="color: #000000; font-weight: bold;">this</span>, <span style="color: #0000ff;">&quot;onModuleMessage&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// twitter用インスタンスの生成</span>
		twitter <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Twitter<span style="color: #009900;">&#40;</span>TWITTER_ID, TWITTER_PW<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Module Message受信時に実行されるメソッド
	 * @param evt
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onModuleMessage<span style="color: #009900;">&#40;</span>RoomEvent evt<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		Message message <span style="color: #339933;">=</span> evt.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Map<span style="color: #339933;">&lt;</span>String, String<span style="color: #339933;">&gt;</span> params <span style="color: #339933;">=</span> message.<span style="color: #006633;">getArgs</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// Module Message名を確認</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>message.<span style="color: #006633;">getMessageName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;twit&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// 引数オブジェクトからtextプロパティを取得する</span>
			<span style="color: #003399;">String</span> text <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#41;</span>params.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;text&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			text <span style="color: #339933;">=</span> <span style="color: #003399;">URLDecoder</span>.<span style="color: #006633;">decode</span><span style="color: #009900;">&#40;</span>text<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #666666; font-style: italic;">// twitterへ書き込みをする</span>
			<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
				Status status <span style="color: #339933;">=</span> twitter.<span style="color: #006633;">update</span><span style="color: #009900;">&#40;</span>text <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; #union&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				evt.<span style="color: #006633;">getRoom</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">sendMessage</span><span style="color: #009900;">&#40;</span>
					<span style="color: #0000ff;">&quot;response&quot;</span>, <span style="color: #0000ff;">&quot;ok&quot;</span>, 
					<span style="color: #0000ff;">&quot;http://twitter.com/&quot;</span> 
					<span style="color: #339933;">+</span> TWITTER_ID <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;/status/&quot;</span> <span style="color: #339933;">+</span> status.<span style="color: #006633;">getId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				evt.<span style="color: #006633;">getRoom</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">sendMessage</span><span style="color: #009900;">&#40;</span>
					<span style="color: #0000ff;">&quot;response&quot;</span>, <span style="color: #0000ff;">&quot;ng&quot;</span>, <span style="color: #0000ff;">&quot;can't twit &quot;</span> <span style="color: #339933;">+</span> TWITTER_ID<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> shutdown<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// TODO Auto-generated method stub</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h3>Room Moduleをdeployする</h3>
<p>前回と同じようにAntツールを使ってdeployします。deploy後は、stopserver.bat(.sh)、startserver.bat(.sh)を実行してUnion Serverを再起動しておきましょう。</p>
<h3>簡単なClientを作ってみる</h3>
<p>下記サンプルが動作するためには、localhostに先ほどのRoom Moduleを定義したUnion Serverが起動している必要があります。</p>
<p>twitボタンをクリックすると、先ほど設定したtwitterアカウントで入力したメッセージを呟きます。</p>
<div style="text-align:center;width:465px;"><iframe title="localhostのUnion Serverからtwitする - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/46dca35a57e1362c55135749dbecca3c93e5baa5" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/code/46dca35a57e1362c55135749dbecca3c93e5baa5" title="localhostのUnion Serverからtwitする - wonderfl build flash online">localhostのUnion Serverからtwitする &#8211; wonderfl build flash online</a></div>
<h4>Room Moduleの指定</h4>
<p>２つの方法があります。</p>
<h5>Reactorで指定する方法</h5>
<p>Reactorで指定することで、任意のRoomに任意のRoom Moduleを割り当てることが可能となります。<br />
具体的には以下のように、RoomModulesインスタンスを生成して、割り当てたいRoom Moduleのクラスを指定します。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>135
136
137
138
139
140
141
142
143
144
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">			<span style="color: #009900;">// Room モジュールを指定します。</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> modules<span style="color: #000000; font-weight: bold;">:</span>RoomModules = <span style="color: #0033ff; font-weight: bold;">new</span> RoomModules<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
            modules.addModule<span style="color: #000000;">&#40;</span>
                <span style="color: #990000;">&quot;com.asmple.server.union.module.room.TwitModuleSample&quot;</span>,
                RoomModuleType.CLASS<span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #009900;">// Room モジュールを指定しながらRoomを生成します。</span>
			_room = _reactor.getRoomManager<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.createRoom<span style="color: #000000;">&#40;</span>
                <span style="color: #990000;">&quot;twitRoom&quot;</span>, <span style="color: #0033ff; font-weight: bold;">null</span>, <span style="color: #0033ff; font-weight: bold;">null</span>, modules
             <span style="color: #000000;">&#41;</span>;</pre></td></tr></table></div>

<h5>Union Serverのunion.xmlで指定する方法</h5>
<p>Room Moduleを割り当てたいRoomが固定の場合、Union Serverのunion.xmlで指定すると良いです。今回のRoom ModuleをtwitRoomに割り当てる場合にはunion.xmlに以下のようなセクションを追加します。この例では、twitRoomというRoom IDのRoomにcom.asmple.server.union.module.room.TwitModuleSampleというRoom Moduleが割り当てられます。</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;rooms<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;room<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>twitRoom<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;modules<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;module<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;source</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;class&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    					com.asmple.server.union.module.room.TwitModuleSample
    				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/source<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/module<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/modules<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/room<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/rooms<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<h3>まとめ</h3>
<p>今回は、Module Messageに注目してRoom Moduleを作成してみました。Server側のイベント発生のタイミングで他にも色々なModuleを作成する事が出来ます。Union ServerのModuleを作成すると、よりリッチなマルチユーザアプリケーションを作成する事が出来ます。</p>
<p>今後も、バージョンが更新されるたびに、Union Platformの調査を続けて行きたいと思います。これからもUnionのバージョンアップが楽しみです。</p>
<h3>関連記事</h3>
<ol>
<li><a href="http://fla.la/archives/248" title="UnionPlatform (1) 概要">UnionPlatform (1) 概要</a></li>
<li><a href="http://fla.la/archives/287" title="UnionPlatform (2) 概念">UnionPlatform (2) 概念</a></li>
<li><a href="http://fla.la/archives/351" title="Union Platform(3) 情報の共有化">Union Platform(3) 情報の共有化</a></li>
<li><a href="http://fla.la/archives/315" title="Union Platform(4) Reactorのイベント">Union Platform(4) Reactorのイベント</a></li>
<li><a href="http://fla.la/archives/364" title="Union Platform(5) チャットを作る">Union Platform(5) チャットを作る</a></li>
<li><a href="http://fla.la/archives/347" title="Union Platform(6) Union Server入門">Union Platform(6) Union Server入門</a></li>
<li><a href="http://fla.la/archives/365" title="Union Platform(7) Union Server Module作成準備">Union Platform(7) Union Server Module作成準備</a></li>
<li><a href="http://fla.la/archives/369" title="Union Platform(8) Moduleサンプル">Union Platform(8) Moduleサンプル</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/369/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Union Platform(7) Union Server Module作成準備</title>
		<link>http://fla.la/archives/365</link>
		<comments>http://fla.la/archives/365#comments</comments>
		<pubDate>Sat, 05 Sep 2009 08:07:19 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[Union Platform]]></category>
		<category><![CDATA[server java eclipse]]></category>

		<guid isPermaLink="false">http://fla.la/?p=365</guid>
		<description><![CDATA[本エントリーでは、Server ModuleとRoom Moduleを作成する際の準備方法を紹介します。UnionのバージョンはUnion alpha3を使用します。 Union ServerはJAVA言語で記述されているため、Server Module、Room ModuleともにJAVA言語で作成します。JAVA言語での開発にはeclipseを使うと便利です。 eclipeを使ったModule作成の準備 eclipseを使ってModuleを作成する際の準備方法を簡単に紹介します。 eclipseのインストール eclipseを未だインストールしていない場合は、elipseの公式サイトからアーカイブをダウンロードしインストールします。ダウンロードして来たeclipse-SDK-3.5-win32.zipを解凍しお好きな場所へ配置します。 今回はWindowsにインストールする例ですが、Mac OS Xでもほとんど同じです。 以下のように配置しました。これらのパスはご自身の環境に合わせて読み替えて頂ければと思います。 e:\eclipse e:\workspace e:\union プロジェクトの作成 [File] -> [new] -> [Java Project]を選択します。 Project nameはお好きな名前で良いですが、今回はunion_platform等と入力します。 ContentsはCreate project from existing sourceを選択します。 Directory: に e:¥union と入力します。これはunion serverのディレクトリを指定して下さい。 [Next]をクリックします。 [Finish]をクリックします。 これでUnion ServerのModuleを作成するProjectが作成出来ました。 Source Folderの作成 .javaファイルを格納するSource Folderを作成します。 Package Explorerでunion_platform(プロジェクト名)からコンテキストメニューを表示します。 [New] -> [Source Folder]を選択します。 Folder name: に [...]]]></description>
			<content:encoded><![CDATA[<p>本エントリーでは、Server ModuleとRoom Moduleを作成する際の準備方法を紹介します。UnionのバージョンはUnion alpha3を使用します。</p>
<p>Union ServerはJAVA言語で記述されているため、Server Module、Room ModuleともにJAVA言語で作成します。JAVA言語での開発にはeclipseを使うと便利です。</p>
<h3>eclipeを使ったModule作成の準備</h3>
<p>eclipseを使ってModuleを作成する際の準備方法を簡単に紹介します。</p>
<h4>eclipseのインストール</h4>
<p>eclipseを未だインストールしていない場合は、<a href="http://www.eclipse.org/">elipseの公式サイト</a>からアーカイブをダウンロードしインストールします。ダウンロードして来たeclipse-SDK-3.5-win32.zipを解凍しお好きな場所へ配置します。</p>
<p>今回はWindowsにインストールする例ですが、Mac OS Xでもほとんど同じです。<br />
以下のように配置しました。これらのパスはご自身の環境に合わせて読み替えて頂ければと思います。</p>
<ul>
<li>e:\eclipse</li>
<li>e:\workspace</li>
<li>e:\union</li>
</ul>
<p><span id="more-365"></span></p>
<h4>プロジェクトの作成</h4>

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_1" width="512" height="312" align="center">
      <param name="movie" value="http://fla.la/wp-content/uploads/2009/09/union_platform007_002.swf?startingPlaybackMode=1" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fla.la/wp-content/uploads/2009/09/union_platform007_002.swf?startingPlaybackMode=1" width="512" height="312" align="center">
      <!--<![endif]-->
        プロジェクトの作成
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>

<ol>
<li>[File] -> [new] -> [Java Project]を選択します。</li>
<li>Project nameはお好きな名前で良いですが、今回はunion_platform等と入力します。</li>
<li>ContentsはCreate project from existing sourceを選択します。</li>
<li>Directory: に e:¥union と入力します。これはunion serverのディレクトリを指定して下さい。</li>
<li>[Next]をクリックします。</li>
<li>[Finish]をクリックします。</li>
</ol>
<p>これでUnion ServerのModuleを作成するProjectが作成出来ました。</p>
<h4>Source Folderの作成</h4>
<p>.javaファイルを格納するSource Folderを作成します。<br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_2" width="512" height="312" align="center">
      <param name="movie" value="http://fla.la/wp-content/uploads/2009/09/union_platform007_003.swf?startingPlaybackMode=1" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fla.la/wp-content/uploads/2009/09/union_platform007_003.swf?startingPlaybackMode=1" width="512" height="312" align="center">
      <!--<![endif]-->
        Source Folderの作成
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
 </p>
<ol>
<li>Package Explorerでunion_platform(プロジェクト名)からコンテキストメニューを表示します。</li>
<li>[New] -> [Source Folder]を選択します。</li>
<li>Folder name: に src と入力します。</li>
<li>[Finish]をクリックします。</li>
</ol>
<p>e:¥union¥srcが作成されていれば成功です。ソース格納場所が出来上がりました。次はここにクラスを作成して行きます。</p>
<h4>Classの作成</h4>

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_3" width="512" height="312" align="center">
      <param name="movie" value="http://fla.la/wp-content/uploads/2009/09/union_platform007_004.swf?startingPlaybackMode=1" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fla.la/wp-content/uploads/2009/09/union_platform007_004.swf?startingPlaybackMode=1" width="512" height="312" align="center">
      <!--<![endif]-->
        Classの作成
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>

<ol>
<li>Package Explorerでunion_platform(プロジェクト名)からコンテキストメニューを表示します。</li>
<li>[New] -> [Class]を選択します。</li>
<li>Package:に作成したいパッケージ名を入力します。今回は、com.asmple.server.union.module.serverとしました。</li>
<li>Name:にPackageに所属させるクラス名を入力します。今回は、ServerModuleSampleとしました。</li>
<li>Interfaces:の横の[Add]をクリックします。</li>
<li>Choose interfaces: に Moduleと入力します。</li>
<li>Matching intems: に Module &#8211; net.user1.union.api と表示されるので、選択して[OK]をクリックします。</li>
<li>[Finish]をクリックします。</li>
</ol>
<p>e:¥union¥src¥com¥asmple¥server¥union¥module¥server¥ServerModuleSample.javaが作成されていれば成功です。</p>
<h5>ServerModuleSampleの編集</h5>
<p>さて、以下のようなjavaファイルが自動で生成されますが、L:11のreturnをtrueに変更します。ここでtrueをreturnしておかないとModuleの初期化に失敗してしまいますので注意しましょう。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.asmple.server.union.module.server</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">net.user1.union.api.Module</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">net.user1.union.core.context.ModuleContext</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ServerModuleSample <span style="color: #000000; font-weight: bold;">implements</span> Module <span style="color: #009900;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> init<span style="color: #009900;">&#40;</span>ModuleContext arg0<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// TODO Auto-generated method stub</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> shutdown<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// TODO Auto-generated method stub</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>L:11を以下のように変更。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>11
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h4>build.xmlの作成</h4>
<p>antツールを使って、jarファイルを作成する準備をします。モジュールをいくつも作成した際に、jarにまとめてしまおうという考えです。以下のようなe:¥union¥build.xmを作成します。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;Shift_JIS&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;project</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;com_asmple_union_server_module&quot;</span> <span style="color: #000066;">default</span>=<span style="color: #ff0000;">&quot;jar&quot;</span> <span style="color: #000066;">basedir</span>=<span style="color: #ff0000;">&quot;.&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;jar&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;jar</span> <span style="color: #000066;">basedir</span>=<span style="color: #ff0000;">&quot;./bin&quot;</span> <span style="color: #000066;">jarfile</span>=<span style="color: #ff0000;">&quot;lib/com-asmple-server-union-module.jar&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/project<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<h5>antに登録</h5>

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_4" width="512" height="312" align="center">
      <param name="movie" value="http://fla.la/wp-content/uploads/2009/09/union_platform007_005.swf?startingPlaybackMode=1" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fla.la/wp-content/uploads/2009/09/union_platform007_005.swf?startingPlaybackMode=1" width="512" height="312" align="center">
      <!--<![endif]-->
        antに登録
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>

<ol>
<li>[Window] -> [Show View] -> Antを選択します。</li>
<li>Ant Viewの左のボタン(Add Buildfiles)をクリックします。</li>
<li>union_platform(プロジェクト名)配下のbuild.xml(先ほど作成したもの)を選択します。</li>
<li>Ant Viewに新しいBuildファイルが追加されます。</li>
<li>com_asmple_union_server_moduleを選択して、右から３番目の矢印アイコン(Run)をクリックします。</li>
</ol>
<p>e:¥union¥lib¥com-asmple-server-union-module.jar が出来上がっていれば成功。これでClassファイルを更新した際には、AntのRunを実行することで、jarファイルを更新できます。</p>
<h4>startup.bat(.sh)の編集</h4>
<p>Windows環境の場合はstartup.batを編集します。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">java <span style="color: #660033;">-cp</span> lib\union.jar;lib\stax-api-1.0.1.jar;lib\wstx-asl-3.2.6.jar net.user1.union.core.UnionMain start</pre></div></div>

<p>lib\wstx-asl-3.2.6.jarの後ろに以下を追記します。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">;lib\com-asmple-server-union-module.jar</pre></div></div>

<p>Mac OS X, Linux環境の場合はstartup.shを編集します。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
java <span style="color: #660033;">-cp</span> lib<span style="color: #000000; font-weight: bold;">/</span>union.jar:lib<span style="color: #000000; font-weight: bold;">/</span>stax-api-1.0.1.jar:lib<span style="color: #000000; font-weight: bold;">/</span>wstx-asl-3.2.6.jar net.user1.union.core.UnionMain start <span style="color: #000000; font-weight: bold;">&amp;</span></pre></div></div>

<p>lib/wstx-asl-3.2.6.jarの後ろに以下を追記します。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">:lib<span style="color: #000000; font-weight: bold;">/</span>com-asmple-server-union-module.jar</pre></div></div>

<h4>union.xmlの編集</h4>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;union<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;server<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;admin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;port<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>9110<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/port<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    	    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;password<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>password<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/password<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/admin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;client_timeout<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>30<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/client_timeout<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/server<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;gateways<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;gateway</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;IOGateway&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;flash:io&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	    	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;port<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>9100<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/port<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;policy_file<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>policy.xml<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/policy_file<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/gateway<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>  
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;gateway</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;NIOGateway&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;flash:nio&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;port<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>9101<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/port<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;policy_file<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>policy.xml<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/policy_file<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/gateway<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>         	    
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/gateways<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;modules<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;module<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>serverStatsServerModule<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;source</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;class&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>net.user1.union.servermodule.ServerStatsServerModule<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/source<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;attributes<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;attribute</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;interval&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>300<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/attribute<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/attributes<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/module<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>   
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/modules<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/union<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>L:26の下に以下を追加</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;module<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>serverModuleSample<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;source</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;class&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>com.asmple.server.union.module.server.ServerModuleSample<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/source<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/module<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<h4>Union Server起動</h4>
<p>startup.bat(.sh)を実行して下記のようなログが出力されれば、新しいServer Moduleのロードは成功です。</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">2009-09-05 16:22:52,046 INFO  - Loaded module type [class] with code [com.asmple.server.union.module.server.ServerModuleSample]
2009-09-05 16:22:52,046 WARN  - Server module [serverModuleSample] loaded.</pre></div></div>

<h3>まとめ</h3>
<p>今回はeclipseを使って、Union ServerのModuleを作成する準備をしてきました。私自身普段はeclipseもJAVAも触らないのですが、大分効率化出来そうですね。もっと良い方法などありましたら、是非ともご教授下さい。</p>
<p>では、次回は実際にModuleを作成してみようと思います。</p>
<h3>関連記事</h3>
<ol>
<li><a href="http://fla.la/archives/248" title="UnionPlatform (1) 概要">UnionPlatform (1) 概要</a></li>
<li><a href="http://fla.la/archives/287" title="UnionPlatform (2) 概念">UnionPlatform (2) 概念</a></li>
<li><a href="http://fla.la/archives/351" title="Union Platform(3) 情報の共有化">Union Platform(3) 情報の共有化</a></li>
<li><a href="http://fla.la/archives/315" title="Union Platform(4) Reactorのイベント">Union Platform(4) Reactorのイベント</a></li>
<li><a href="http://fla.la/archives/364" title="Union Platform(5) チャットを作る">Union Platform(5) チャットを作る</a></li>
<li><a href="http://fla.la/archives/347" title="Union Platform(6) Union Server入門">Union Platform(6) Union Server入門</a></li>
<li><a href="http://fla.la/archives/365" title="Union Platform(7) Union Server Module作成準備">Union Platform(7) Union Server Module作成準備</a></li>
<li><a href="http://fla.la/archives/369" title="Union Platform(8) Moduleサンプル">Union Platform(8) Moduleサンプル</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/365/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Union Platform(6) Union Server入門</title>
		<link>http://fla.la/archives/347</link>
		<comments>http://fla.la/archives/347#comments</comments>
		<pubDate>Sat, 05 Sep 2009 04:47:02 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[Union Platform]]></category>
		<category><![CDATA[server java]]></category>

		<guid isPermaLink="false">http://fla.la/?p=347</guid>
		<description><![CDATA[本エントリーではUnion Serverに焦点を合わせます。UnionのバージョンはUnion alpha3を使用します。 Union Serverはtryunion.comを利用して試すことが出来ますが、ローカルにもUnion Serverをインストールすることで快適な開発環境を整備しましょう。 システム要件 System Requirementsに記載されています。JAVAの実行環境があれば、大抵は動くと思います。 Union Serverのインストール Union ServerはJAVAの実行環境があれば、実行出来ます。Windows、Mac OS X、各種Linuxへインストールが可能です。 Union Serverを実際にインストールして、管理ツールから接続を確認してみましょう。 Union Serverをダウンロードする Admin接続用swfクライアントUnionAdmin.swfをダウンロードする ダウンロードしたUnion Serverのアーカイブを解凍する 解凍したフォルダにある、startserver.bat(startserver.sh)を実行する UnionAdmin.swfを実行する 接続先は、localhostとし、パスワードはpasswordで管理ツールが起動する UnionAdmin.swfからUnion Serverを停止することも出来る Windows上での上記操作をキャプチャしてみました。あっという間にUnion Serverを操作出来きるようになることが分かると思います。 localhostのUnion Serverを試す では、もう一度startserver.bat(startserver.sh)を実行して、Union Serverが起動しましょう。この状態で、Reactorから接続が可能な状態となります。 localhostへ繋ぐサンプル localhostへ接続してみる &#8211; wonderfl build flash online 起動時のログ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [...]]]></description>
			<content:encoded><![CDATA[<p>本エントリーではUnion Serverに焦点を合わせます。UnionのバージョンはUnion alpha3を使用します。</p>
<p>Union Serverはtryunion.comを利用して試すことが出来ますが、ローカルにもUnion Serverをインストールすることで快適な開発環境を整備しましょう。</p>
<h3>システム要件</h3>
<p><a href="http://www.unionplatform.com/?page_id=411">System Requirements</a>に記載されています。JAVAの実行環境があれば、大抵は動くと思います。</p>
<h3>Union Serverのインストール</h3>
<p>Union ServerはJAVAの実行環境があれば、実行出来ます。Windows、Mac OS X、各種Linuxへインストールが可能です。</p>
<p>Union Serverを実際にインストールして、管理ツールから接続を確認してみましょう。</p>
<ul>
<li>Union Serverをダウンロードする</li>
<li>Admin接続用swfクライアントUnionAdmin.swfをダウンロードする</li>
<li>ダウンロードしたUnion Serverのアーカイブを解凍する</li>
<li>解凍したフォルダにある、startserver.bat(startserver.sh)を実行する</li>
<li>UnionAdmin.swfを実行する</li>
<li>接続先は、localhostとし、パスワードはpasswordで管理ツールが起動する</li>
<li>UnionAdmin.swfからUnion Serverを停止することも出来る</li>
</ul>
<p><span id="more-347"></span><br />
Windows上での上記操作をキャプチャしてみました。あっという間にUnion Serverを操作出来きるようになることが分かると思います。</p>

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_5" width="512" height="312" align="center">
      <param name="movie" value="http://fla.la/wp-content/uploads/2009/09/union_platform006_001.swf?startingPlaybackMode=1" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fla.la/wp-content/uploads/2009/09/union_platform006_001.swf?startingPlaybackMode=1" width="512" height="312" align="center">
      <!--<![endif]-->
        Union Serverインストール
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>

<h3>localhostのUnion Serverを試す</h3>
<p>では、もう一度startserver.bat(startserver.sh)を実行して、Union Serverが起動しましょう。この状態で、Reactorから接続が可能な状態となります。</p>
<h4>localhostへ繋ぐサンプル</h4>
<div style="text-align:center;width:465px;"><iframe title="localhostへ接続してみる - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/bd4c3b1e1d01a618de727a6f0108bec5a0671dd2" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/code/bd4c3b1e1d01a618de727a6f0108bec5a0671dd2" title="localhostへ接続してみる - wonderfl build flash online">localhostへ接続してみる &#8211; wonderfl build flash online</a></div>
<h4>起動時のログ</h4>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;">2009-09-05 12:47:31,175 WARN  - *** Starting Union Alpha 1.0.0 (build 283) ***
2009-09-05 12:47:31,175 WARN  - **********************************************
2009-09-05 12:47:31,175 WARN  - UPC Version: 1.3.0
2009-09-05 12:47:31,470 WARN  - Using CharSet [UTF-8]
2009-09-05 12:47:31,474 INFO  - ContextManager initialized.
2009-09-05 12:47:31,545 WARN  - UNION_HOME set to [/path/to/union/.]
2009-09-05 12:47:31,649 WARN  - Gateway [IOGateway] bound to port [9100] on all local IP addresses.
2009-09-05 12:47:31,650 INFO  - Gateway [IOGateway] added to the Server.
2009-09-05 12:47:31,869 WARN  - Gateway [NIOGateway] bound to port [9101] on all local IP addresses.
2009-09-05 12:47:31,869 INFO  - Gateway [NIOGateway] added to the Server.
2009-09-05 12:47:31,871 INFO  - Loaded module type [class] with code [net.user1.union.servermodule.ServerStatsServerModule]
2009-09-05 12:47:31,872 WARN  - Server module [serverStatsServerModule] loaded.
2009-09-05 12:47:31,882 WARN  - POLICY_FILE attribute missing for Gateway [_ADMIN_GATEWAY_].  Using default [policy.xml].
2009-09-05 12:47:31,882 WARN  - Gateway [_ADMIN_GATEWAY_] bound to port [9110] on all local IP addresses.
2009-09-05 12:47:31,883 INFO  - Gateway [_ADMIN_GATEWAY_] added to the Server.
2009-09-05 12:47:31,924 WARN  - Banned list file [banned.txt] not found.  Banned list not initiated.
2009-09-05 12:47:31,924 WARN  - Admin Gateway Started.
2009-09-05 12:47:31,924 INFO  - ContextManager started.
2009-09-05 12:47:31,924 WARN  - Union Alpha 1.0.0 (build 283) Started....OK
2009-09-05 12:47:31,983 WARN  - 
-----------------
SERVER STATS
-------------------------------------------------------------------------
Memory Usage [init = 0(0K) used = 11201888(10939K) committed = 83230720(81280K) max = 85393408(83392K)]
Thread Usage [9]
-------------------------------------------------------------------------</pre></td></tr></table></div>

<h4>connect時のログ</h4>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;">2009-09-05 12:53:54,928 INFO  - Gateway [IOGateway] accepted a connection.
2009-09-05 12:53:54,981 INFO  - Gateway [IOGateway] accepted a connection.
2009-09-05 12:53:55,030 INFO  - Client [1] connected to the server. UID [0:0:0:0:0:0:0:1%0]
2009-09-05 12:53:55,030 DEBUG - Server received from client [1] message [<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;U<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;M<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>u65<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/M<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;L<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Reactor<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Flash Player WIN 10,0,32,18 PlugIn (debug, remote); 1.0.0 (Build 247)<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1.3.0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/L<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/U<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>]
2009-09-05 12:53:55,049 DEBUG - Server sending to client [1] message [<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;U<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;M<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>u66<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/M<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;L<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Union Alpha 1.0.0 (build 283)<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1.3.0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>true<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/L<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/U<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>]
2009-09-05 12:53:55,049 DEBUG - Server sending to client [1] message [<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;U<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;M<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>u29<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/M<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;L<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/L<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/U<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>]
2009-09-05 12:53:55,096 DEBUG - Server sending to client [1] message [<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;U<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;M<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>u8<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/M<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;L<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><span style="color: #339933;">&lt;![CDATA[]]&gt;</span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><span style="color: #339933;">&lt;![CDATA[_CT]]&gt;</span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><span style="color: #339933;">&lt;![CDATA[1252122835050]]&gt;</span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>SUCCESS<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/L<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/U<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>]
2009-09-05 12:53:55,096 DEBUG - Server sending to client [1] message [<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;U<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;M<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>u8<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/M<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;L<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><span style="color: #339933;">&lt;![CDATA[]]&gt;</span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><span style="color: #339933;">&lt;![CDATA[_IP]]&gt;</span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><span style="color: #339933;">&lt;![CDATA[0:0:0:0:0:0:0:1%0]]&gt;</span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>SUCCESS<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/L<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/U<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>]
2009-09-05 12:53:55,097 DEBUG - Server sending to client [1] message [<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;U<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;M<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>u63<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/M<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;L<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/L<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/U<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>]
2009-09-05 12:53:55,120 DEBUG - Server received from client [1] message [<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;U<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;M<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>u24<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/M<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;L<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><span style="color: #339933;">&lt;![CDATA[test]]&gt;</span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><span style="color: #339933;">&lt;![CDATA[_DIE_ON_EMPTY|true|_MAX_CLIENTS|-1|_PASSWORD||_CLIENT_TIMEOUT|-1]]&gt;</span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/L<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/U<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>]
2009-09-05 12:53:55,141 DEBUG - Room [test] initialized.
2009-09-05 12:53:55,142 DEBUG - Room [test] started.
2009-09-05 12:53:55,142 INFO  - Room [test] initialized and started.
2009-09-05 12:53:55,142 DEBUG - Server sending to client [1] message [<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;U<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;M<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>u32<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/M<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;L<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><span style="color: #339933;">&lt;![CDATA[test]]&gt;</span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>SUCCESS<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/L<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/U<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>]</pre></td></tr></table></div>

<h4>wonderflの投稿で試す</h4>
<p>wonderflのunionタグのついた投稿を探して、forkしてみましょう。そして、Union Serverのホストをtryunion.comからlocalhostに変更します。すると、ローカルのUnion Serverへ接続するログが出力される事が確認出来ます。</p>
<p>もちろん、Union ServerのURLをlocalhostとした作品は自身のPCからしか正常に動作しないので注意して下さい。</p>
<h3>設定の確認</h3>
<p>Union Serverの設定はXMLファイルで行います。</p>
<h4>policy.xml</h4>
<p>Union ServerはFlash PlayerのSocket接続機能を利用します。Flash PlayerからSocket接続を行うためには、ソケット接続のポリシーファイルを用意する必要がありますので、Union Serverはソケット接続のポリシーファイルを自動で配布するようになっています。</p>
<p>policy.xmlではUnion Serverで利用するソケット接続のポリシーを設定します。</p>
<p>以下の例では、すべてのドメインに配置してあるswfからの接続を許可します。外部に公開するサーバでは必ず適切な設定に変更しましょう。特に管理用ポートからのアクセスは塞ぐと良いです。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;cross-domain-policy<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;allow-access-from</span> <span style="color: #000066;">domain</span>=<span style="color: #ff0000;">&quot;*&quot;</span> <span style="color: #000066;">to-ports</span>=<span style="color: #ff0000;">&quot;9100,9101,9110&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/cross-domain-policy<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<h4>union.xml</h4>
<p>Union Serverの動作を設定するファイルです。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;union<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;server<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;admin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;port<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>9110<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/port<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    	    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;password<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>password<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/password<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/admin<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;client_timeout<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>30<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/client_timeout<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/server<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;gateways<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;gateway</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;IOGateway&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;flash:io&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	    	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;port<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>9100<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/port<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;policy_file<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>policy.xml<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/policy_file<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/gateway<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>  
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;gateway</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;NIOGateway&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;flash:nio&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;port<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>9101<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/port<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;policy_file<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>policy.xml<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/policy_file<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/gateway<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>         	    
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/gateways<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;modules<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;module<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>serverStatsServerModule<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;source</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;class&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>net.user1.union.servermodule.ServerStatsServerModule<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/source<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;attributes<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;attribute</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;interval&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>300<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/attribute<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/attributes<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/module<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>   
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/modules<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/union<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>最低限、管理用のパスワードは変更しておきましょう。その他モジュールの設定などを行うことができます。</p>
<h5>管理用パスワード変更時の注意点</h5>
<p>stopserver.bat(.sh)には、管理用のパスワードを記述する必要があります。</p>
<h6>Windows環境の場合</h6>
<p>stopserver.batを編集します。SET PASSWORDの値を変更します。管理用サーバのportを変更した際にはSET PORTの値を変更します。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">SET <span style="color: #007800;">HOST</span>=localhost
SET <span style="color: #007800;">PORT</span>=<span style="color: #000000;">9110</span>
SET <span style="color: #007800;">PASSWORD</span>=yourpassword
java <span style="color: #660033;">-cp</span> lib\union.jar;lib\mariner.jar net.user1.union.core.UnionMain <span style="color: #000000; font-weight: bold;">%</span>HOST<span style="color: #000000; font-weight: bold;">%</span> <span style="color: #000000; font-weight: bold;">%</span>PORT<span style="color: #000000; font-weight: bold;">%</span> <span style="color: #000000; font-weight: bold;">%</span>PASSWORD<span style="color: #000000; font-weight: bold;">%</span> a5</pre></div></div>

<h6>Mac OS X, Linux環境の場合</h6>
<p>stopserver.shを編集します。PASSWORDの値を変更します。管理用サーバのportを変更した際にはPORTの値を変更します。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
<span style="color: #007800;">HOST</span>=localhost
<span style="color: #007800;">PORT</span>=<span style="color: #000000;">9110</span>
<span style="color: #007800;">PASSWORD</span>=password
java <span style="color: #660033;">-cp</span> lib<span style="color: #000000; font-weight: bold;">/</span>union.jar:lib<span style="color: #000000; font-weight: bold;">/</span>mariner.jar net.user1.union.core.UnionMain <span style="color: #007800;">$HOST</span> <span style="color: #007800;">$PORT</span> <span style="color: #007800;">$PASSWORD</span> a5</pre></div></div>

<h5>その他の設定</h5>
<p><a href="http://www.unionplatform.com/?page_id=416">Configuration</a>に詳しく記載されています。</p>
<h4>ポートの確認</h4>
<p>前述のとおり、Union Serverではソケット接続を行うので、ソケット接続のポリシーファイルを配布します。Flash Playerはソケット接続のポリシーファイルの取得時、ソケット接続先のサーバの843ポートに接続します。(このポートは変更することも可能)</p>
<p>また、union.xmlに指定したようにUnion Serverはデフォルトで9100ポートを使用します。</p>
<p>よって、Union Serverを外部に公開するような際には、ソケット接続のポリシーファイル配布用のポート(デフォルトで843)と、Union ServerのGatewayのポート(デフォルトで9100)のポートを開けておくのを忘れないようにしましょう。すでに843ポートで別のポリシーファイルを配布しているサーバでは、Union Serverのpolicy.xmlを設定してもその設定が反映されずに、動作しないということがあるので気をつけましょう。</p>
<h4>Module</h4>
<p>Moduleを使う事でUnion Serverの機能を拡張する事が出来ます。具体的には、サーバ側の各種イベント送出時のハンドラを登録することで、独自の挙動を追加出来ます。</p>
<p>また、Union Serverからの送信するMessage機能を使ってチャットボットのような機能を作成することも可能となります。</p>
<h5>Server Module</h5>
<p>Server Moduleはサーバ全体に影響を及ぼすモジュールです。</p>
<h5>Room Module</h5>
<p>Room Moduleは特定のRoomに影響を及ぼすモジュールです。</p>
<h3>まとめ</h3>
<p>さて、Union Serverをローカルにインストールする事でUnion Platformを使ったアプリケーション開発をローカルで行う事が出来るようになりました。</p>
<p>次回は、eclipseをインストールして、公式サイトのサンプルにあるようなモジュールを動かすまでの手順を紹介します。</p>
<h3>関連記事</h3>
<ol>
<li><a href="http://fla.la/archives/248" title="UnionPlatform (1) 概要">UnionPlatform (1) 概要</a></li>
<li><a href="http://fla.la/archives/287" title="UnionPlatform (2) 概念">UnionPlatform (2) 概念</a></li>
<li><a href="http://fla.la/archives/351" title="Union Platform(3) 情報の共有化">Union Platform(3) 情報の共有化</a></li>
<li><a href="http://fla.la/archives/315" title="Union Platform(4) Reactorのイベント">Union Platform(4) Reactorのイベント</a></li>
<li><a href="http://fla.la/archives/364" title="Union Platform(5) チャットを作る">Union Platform(5) チャットを作る</a></li>
<li><a href="http://fla.la/archives/347" title="Union Platform(6) Union Server入門">Union Platform(6) Union Server入門</a></li>
<li><a href="http://fla.la/archives/365" title="Union Platform(7) Union Server Module作成準備">Union Platform(7) Union Server Module作成準備</a></li>
<li><a href="http://fla.la/archives/369" title="Union Platform(8) Moduleサンプル">Union Platform(8) Moduleサンプル</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/347/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Union Platform(5) チャットを作る</title>
		<link>http://fla.la/archives/364</link>
		<comments>http://fla.la/archives/364#comments</comments>
		<pubDate>Fri, 04 Sep 2009 16:02:40 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[Union Platform]]></category>

		<guid isPermaLink="false">http://fla.la/?p=364</guid>
		<description><![CDATA[本エントリーでは、Union Platform alpha3を使ってチャットを作ってみます。UnionのバージョンはUnion alpha3を使用します。 主に、以下の事項を確認していきます。 observeとjoinの違いを確認 Client Attributeの使い方を確認 Messageの使い方を確認 各種基本的なイベント処理を確認 実際に動作するサンプルはwonderflに投稿してあります。 Unionチャットサンプル &#8211; wonderfl build flash online 機能 このswfファイルを閲覧する人をユーザと呼びます。ユーザは以下のようなことが出来ます。 ユーザは、observeボタンをクリックすることでRoom ID: com.asmple.union.chatへobserveすることが出来ます。 ユーザは、joinボタンをクリックすることでRoom ID: com.asmple.union.chatへjoinすることが出来ます。 ユーザは、色コードを入力し、Update Attributeボタンをクリックすることで、Client Attributeを通じてアバター・発言の色を変更することが出来ます。 ユーザは、ニックネームを入力し、Update Attributeボタンをクリックスすることで、Client Attributeを通じて発言時のニックネームを変更することが出来ます。 ユーザは、Roomにjoinした状態であれば以下の操作が可能です。 ユーザは、メッセージ入力欄にメッセージを入力し、エンターキーを押すことで、Messageを通じて発言することが出来ます。 ユーザは、アバターフィールド内をクリックすることで自身のアバターの位置をClient Attributeを通じて変更することが出来ます。 observeとjoin observeとjoinの概念的な説明は、UnionPlatform (2) 概念にて解説しております。 observeとjoinの違いを体験 今回は実際にobserveとjoinの違いを体験できます。 以下のswfは上のものとまったく同じものです。先ほどのswfと下記swf両方を再生し、先ほどのswfでjoinボタンをクリックしてから画面内のアバターを移動してみましょう。 このとき、下記のswfでは何も見えないはずです。まだRoomにobserveもjoinもしていないからです。 次に、下記swfでobserveボタンをクリックすると、画面内にアバターが表示されます。(同時に本エントリーを閲覧している人がいたら数人のアバターが表示されるかもしれません。)ただ、画面内には自分のアバターも表示されませんが、発言は出来ることが分かる思います。 Messageの送信について なお、Union alpha3ではobserve, joinせずにまたは、observe時もMessageを送信出来ます。RoomにjoinしていないClientからのMessage送信を抑止する為には、自身でチェックコードを書く必要があります。 リリース時には権限管理の強化で挙動は変更される可能性があるそうです。(@keno42さんがcolinさんに確認してくれました。この場を借りて感謝致します。) Unionチャットサンプル &#8211; wonderfl build flash online [...]]]></description>
			<content:encoded><![CDATA[<p>本エントリーでは、Union Platform alpha3を使ってチャットを作ってみます。UnionのバージョンはUnion alpha3を使用します。<br />
主に、以下の事項を確認していきます。</p>
<ul>
<li>observeとjoinの違いを確認</li>
<li>Client Attributeの使い方を確認</li>
<li>Messageの使い方を確認</li>
<li>各種基本的なイベント処理を確認</li>
</ul>
<p>実際に動作するサンプルはwonderflに投稿してあります。</p>
<div style="text-align:center;width:465px;"><iframe title="Unionチャットサンプル - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/d65724b1c2c161a9bc77b435951d381921961eb9" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/code/d65724b1c2c161a9bc77b435951d381921961eb9" title="Unionチャットサンプル - wonderfl build flash online">Unionチャットサンプル &#8211; wonderfl build flash online</a></div>
<p><span id="more-364"></span></p>
<h3>機能</h3>
<p>このswfファイルを閲覧する人をユーザと呼びます。ユーザは以下のようなことが出来ます。</p>
<ul>
<li>ユーザは、observeボタンをクリックすることでRoom ID: com.asmple.union.chatへobserveすることが出来ます。</li>
<li>ユーザは、joinボタンをクリックすることでRoom ID: com.asmple.union.chatへjoinすることが出来ます。</li>
<li>ユーザは、色コードを入力し、Update Attributeボタンをクリックすることで、Client Attributeを通じてアバター・発言の色を変更することが出来ます。</li>
<li>ユーザは、ニックネームを入力し、Update Attributeボタンをクリックスすることで、Client Attributeを通じて発言時のニックネームを変更することが出来ます。</li>
<li>ユーザは、Roomにjoinした状態であれば以下の操作が可能です。
<ul>
<li>ユーザは、メッセージ入力欄にメッセージを入力し、エンターキーを押すことで、Messageを通じて発言することが出来ます。</li>
<li>ユーザは、アバターフィールド内をクリックすることで自身のアバターの位置をClient Attributeを通じて変更することが出来ます。</li>
</ul>
</ul>
<h4>observeとjoin</h4>
<p>observeとjoinの概念的な説明は、<a href="http://fla.la/archives/287">UnionPlatform (2) 概念</a>にて解説しております。</p>
<h5>observeとjoinの違いを体験</h5>
<p>今回は実際にobserveとjoinの違いを体験できます。</p>
<p>以下のswfは上のものとまったく同じものです。先ほどのswfと下記swf両方を再生し、先ほどのswfでjoinボタンをクリックしてから画面内のアバターを移動してみましょう。</p>
<p>このとき、下記のswfでは何も見えないはずです。まだRoomにobserveもjoinもしていないからです。</p>
<p>次に、下記swfでobserveボタンをクリックすると、画面内にアバターが表示されます。(同時に本エントリーを閲覧している人がいたら数人のアバターが表示されるかもしれません。)ただ、画面内には自分のアバターも表示されませんが、発言は出来ることが分かる思います。</p>
<h5>Messageの送信について</h5>
<p>なお、Union alpha3ではobserve, joinせずにまたは、observe時もMessageを送信出来ます。RoomにjoinしていないClientからのMessage送信を抑止する為には、自身でチェックコードを書く必要があります。</p>
<p>リリース時には権限管理の強化で挙動は変更される可能性があるそうです。(@keno42さんがcolinさんに確認してくれました。この場を借りて感謝致します。)</p>
<div style="text-align:center;width:465px;"><iframe title="Unionチャットサンプル - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/d65724b1c2c161a9bc77b435951d381921961eb9" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/code/d65724b1c2c161a9bc77b435951d381921961eb9" title="Unionチャットサンプル - wonderfl build flash online">Unionチャットサンプル &#8211; wonderfl build flash online</a></div>
<p>というわけで、observeとjoinの違いを感じていただけましたでしょうか。observeとjoinの切り替えにはUnion alpha3の時点では不都合と思われる挙動があるため、本エントリーではその点も確認していきます。</p>
<h4>Client AttributeとMessage</h4>
<p>Client AttributeとMessageは情報の共有化に使います。情報の共有化については、<a href="http://fla.la/archives/351">Union Platform(3) 情報の共有化</a>にて解説しております。</p>
<p>Client Attributeは、今回の例ではニックネームや色となります。後から入室したユーザは最新の情報を共有することがわかります。</p>
<p>Messageでの共有は、今回の例では発言メッセージとなります。後から入室したユーザにはそれ以降の情報しか共有されないことが分かります。</p>
<h3>Client Attribute</h3>
<p>各クライアントが持つ属性を定義を紹介します。</p>
<table class="data_table">
<caption>Client Attribute</caption>
<thead>
<tr>
<th>スコープ</th>
<th>用途</th>
<th>key</th>
<th>valueの例</th>
</tr>
</thead>
<tbody>
<tr>
<td>グローバル</td>
<td>クライアントの表示名</td>
<td>nickname</td>
<td>naoto5959</td>
</tr>
<tr>
<td>グローバル</td>
<td>色</td>
<td>color</td>
<td>0&#215;000000</td>
</tr>
<tr>
<td>グローバル</td>
<td>アバター情報</td>
<td>avatar</td>
<td>100,200,0,100</td>
</tr>
</tbody>
</table>
<p>アバターの情報は下記の情報を「,(カンマ)」区切りで格納します。先の例ではx座標:100, y座標:200, 向き:up, 距離:100を表します。</p>
<ul>
<li>目標点のX座標</li>
<li>目標点のY座標</li>
<li>アバターが向く方向(0:up, 1:right, 2:down, 3:left)</li>
<li>アバターと目標座標との距離</li>
</ul>
<p>今回はすべてのClient Attributeのスコープをグローバルにしましたが、もしRoomを増やすことになればRoomごとにアバターの情報は異なるでしょうから、アバター情報のスコープをRoomごとに持つように変更しましょう。</p>
<h3>ユーザーインターフェース</h3>
<p>ユーザーインターフェースのUnionChatUIクラス定義は、L:675以降にあります。<br />
UnionChatUIクラスは以下の図内に示した各パーツに対応したpublicプロパティを持っています。</p>
<div id="attachment_399" class="wp-caption aligncenter" style="width: 550px"><img src="http://fla.la/wp-content/uploads/2009/09/union_platform_005_001.png" alt="チャットサンプルのUI" title="チャットサンプルのUI" width="540" height="519" class="size-full wp-image-399" /><p class="wp-caption-text">チャットサンプルのUI</p></div>
<table class="data_table">
<caption>ユーザーインターフェースのプロパティ</caption>
<thead>
<tr>
<th>プロパティ名</th>
<th>役割</th>
</tr>
</thead>
<tbody>
<tr>
<td>loadingCircle</td>
<td>Union Serverとの接続待ちの際に表示します。後述するメソッドで制御するため直接操作する必要はありません。</td>
</tr>
<tr>
<td>observeButton</td>
<td>Union Serverの特定のRoomへobserveする際に使用します。observe処理開始時の処理をこのボタンのハンドラへ記述します。</td>
</tr>
<tr>
<td>joinButton</td>
<td>Union Serverの特定のRoomへjoinする際に使用します。join処理開始時の処理をこのボタンのハンドラへ記述します。</td>
</tr>
<tr>
<td>currentStatusLabel</td>
<td>Union Serverとの接続状態を表示します。RoomEvent.JOINなど各イベントのハンドラ内でこのラベルの値を書き換えます。</td>
</tr>
<tr>
<td>currentClientsLabel</td>
<td>Union Serverの特定のRoomにjoinしているClient数を表示します。RoomEvent.CLIENT_COUNTイベントのハンドラ内でこのラベルの値を書き換えます。</td>
</tr>
<tr>
<td>messageField</td>
<td>ユーザ文字を入力し、エンターキーを押した際に、RoomインスタンスのsendMessage()メソッドを通じてMessageを送信する際に使用します。</td>
</tr>
<tr>
<td>messageList</td>
<td>Reactorの各種ログの表示と、RoomインスタンスのsendMessages()メソッドを通じて送信されたMessagesを表示する際に使用します。</td>
</tr>
<tr>
<td>colorChooser</td>
<td>自身のアバター・発言色を表すClient Attributeのcolorを変更する際に使用します。</td>
</tr>
<tr>
<td>nicknameField</td>
<td>自身のニックネーム色を表すClient Attributeのnicknameを変更する際に使用します。</td>
</tr>
<tr>
<td>updateButton</td>
<td>colorChooser, nicknameFieldで設定した各Client Attributeの値を更新する際に使用します。Client Attributeの更新処理をこのボタンのハンドラへ記述します。</td>
</tr>
<tr>
<td>avatarField</td>
<td>自身のアバターの位置を表すClient Attributeのavatarを変更する際に使用します。このオブジェクトをクリックした際</td>
</tr>
</tbody>
</table>
<p>メソッドは以下のものを用意しました。</p>
<table class="data_table">
<caption>ユーザーインターフェースのメソッド</caption>
<thead>
<tr>
<th>メソッド名</th>
<th>引数</th>
<th>役割</th>
</tr>
</thead>
<tbody>
<tr>
<td>playLoading</td>
<td>なし</td>
<td>ローディングサークルを再生します。</td>
</tr>
<tr>
<td>stopLoading</td>
<td>なし</td>
<td>ローディングサークルを停止します。</td>
</tr>
<tr>
<td>appendMessage</td>
<td>表示するメッセージ, メッセージ色</td>
<td>messageListにメッセージを追加します。</td>
</tr>
</tbody>
</table>
<h4>アバター</h4>
<p>アバターは、以下のswfを使用しています。</p>
<div style="text-align:center;width:465px;"><iframe title="シンプルアバター君 - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/afe5412cf117b348681e9eb6e3595035cabd06e6" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/code/afe5412cf117b348681e9eb6e3595035cabd06e6" title="シンプルアバター君 - wonderfl build flash online">シンプルアバター君 &#8211; wonderfl build flash online</a></div>
<p>以下のプロパティとメソッドを備えます。</p>
<table class="data_table">
<caption>アバターのプロパティ</caption>
<thead>
<tr>
<th>プロパティ名</th>
<th>役割</th>
</tr>
</thead>
<tbody>
<tr>
<td>color</td>
<td>アバターの色</td>
</tr>
</tbody>
</table>
<table class="data_table">
<caption>アバターのメソッド</caption>
<thead>
<tr>
<th>メソッド名</th>
<th>引数</th>
<th>役割</th>
</tr>
</thead>
<tbody>
<tr>
<td>play</td>
<td>なし</td>
<td>アバターのアニメーションを再生する</td>
</tr>
<tr>
<td>stop</td>
<td>なし</td>
<td>アバターのアニメーションを停止する</td>
</tr>
<tr>
<td>front</td>
<td>なし</td>
<td>アバターを正面向きにする</td>
</tr>
<tr>
<td>back</td>
<td>なし</td>
<td>アバターの背面向きにする</td>
</tr>
<tr>
<td>left</td>
<td>なし</td>
<td>アバターの左向きにする</td>
</tr>
<tr>
<td>right</td>
<td>なし</td>
<td>アバターの右向きにする</td>
</tr>
</tbody>
</table>
<h3>サンプルコードの解説</h3>
<h4>Union Serverへの接続</h4>
<p>コンストラクタから呼ぶconnectメソッドをみてみましょう。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>154
155
156
157
158
159
160
161
162
163
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #3f5fbf;">/**
		 * UnionServerへ接続します。
		 */</span>
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> <span style="color: #004993;">connect</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			_reactor = <span style="color: #0033ff; font-weight: bold;">new</span> Reactor<span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">null</span>, <span style="color: #0033ff; font-weight: bold;">false</span><span style="color: #000000;">&#41;</span>;
			_reactor.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>ReactorEvent.READY, _reactor_readyHandler<span style="color: #000000;">&#41;</span>;
			_reactor.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>ReactorEvent.<span style="color: #004993;">CLOSE</span>, _reactor_closeHandler<span style="color: #000000;">&#41;</span>;
			_reactor.<span style="color: #004993;">connect</span><span style="color: #000000;">&#40;</span>UNION_SERVER_HOST, UNION_SERVER_PORT<span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>Reactorをnewする際の引数は、1つ目が設定ファイルのxmlの場所。2つ目がデバッグ用のログの出力設定フラグとなります。2つ目の引数をtrueとしておくと、<a href="http://www.adobe.com/support/flashplayer/downloads.html">Flash Debug Player</a>で再生した際に、ログを確認することが出来ます。</p>
<h5>設定ファイルの例</h5>
<p>今回は使用しませんが以下のようなxmlを用意してあげることで自動的にconnectすることが可能です。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;config<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;server<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>tryunion.com<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/server<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ports<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>9100<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ports<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;logLevel<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>DEBUG<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/logLevel<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/config<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<h4>Union Serverへの接続完了</h4>
<p>Union Serverへ接続が完了したことを知るには、ReactorEvent.READYイベントの送出を待ちます。先ほど指定したハンドラの中身をみてみましょう。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> _reactor_readyHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span>ReactorEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			_ui.currentStatusLabel.<span style="color: #004993;">text</span> = <span style="color: #990000;">&quot;connect&quot;</span>;
			_ui.appendMessage<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;ReadyEvent.READY&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #009900;">// 自身のClient参照を取得</span>
			_self = _reactor.getClientManager<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.self<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			_self.setAttribute<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;nickname&quot;</span>, _clientData.nickname<span style="color: #000000;">&#41;</span>;
			_self.setAttribute<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;color&quot;</span>, _clientData.<span style="color: #004993;">color</span><span style="color: #000000;">&#41;</span>;
			_self.setAttribute<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;avatar&quot;</span>, _clientData.avatar<span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #009900;">// 自身のnicknameを設定</span>
			_ui.nicknameField.<span style="color: #004993;">text</span> = _clientData.nickname;
&nbsp;
			<span style="color: #009900;">// 自身のcolorを設定</span>
			_ui.colorChooser.<span style="color: #004993;">value</span> = _clientData.<span style="color: #004993;">color</span>;
&nbsp;
			<span style="color: #009900;">// RoomManager参照を取得</span>
			_roomManager = _reactor.getRoomManager<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
			_roomManager.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>
				RoomManagerEvent.CREATE_ROOM_RESULTS,
				_roomManager_createRoomReslutsHandler<span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #009900;">// Roomへの接続が0となっても残す設定</span>
			<span style="color: #6699cc; font-weight: bold;">var</span> roomSetting<span style="color: #000000; font-weight: bold;">:</span>RoomSettings = <span style="color: #0033ff; font-weight: bold;">new</span> RoomSettings<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			roomSetting.dieOnEmpty = <span style="color: #0033ff; font-weight: bold;">false</span>;
&nbsp;
			<span style="color: #009900;">// 指定したRoom IDを作成する。</span>
			_room = _roomManager.createRoom<span style="color: #000000;">&#40;</span>ROOM_CHAT, roomSetting<span style="color: #000000;">&#41;</span>;
			addRoomEventListeners<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #009900;">// logger参照を取得</span>
			_logger = _reactor.getLog<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			_logger.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>LogEvent.UPDATE, _logger_updateHandler<span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<h5>Client Attributeの初期化</h5>
<p>ReactorEvent.READYイベントが送出された後に、L:491にて自身のClientオブジェクトを取得しています。グロバールスコープのClient Attributeはこのタイミングで代入しておくと良いでしょう。</p>
<h5>Room作成チェック</h5>
<p>L:503にて、RoomManagerインスタンスを取得し、Room作成時のイベントの送出を待ちます。L:514でRoomインスタンスを生成していますが、このRoomインスタンス生成時にUnion Server側でもRoom生成が正常に行われたかをチェックする為に使います。</p>
<h5>RoomSettingでRoomの自動削除を防ぐ</h5>
<p>デフォルトではRoomに接続しているClientがいなくなった時点でRoomは破棄されてしまいます。これを防ぐために、L:510でRoomSettingインスタンスを生成し、dieOnEmptyプロパティにfalseを代入します。このRoomSettingインスタンスをRoomManagerインスタンスのcreateRoomメソッドの第二引数に指定するこたおでRoom内にClientが居ない状態でもRoomを残しておくことが可能です。</p>
<h5>RoomEventのリスナー登録</h5>
<p>L:520でaddRoomEventListeners()メソッドを実行することで、RoomEventの各イベントを監視します。このイベント監視によって、ReactorとUnion Serverとの情報共有を行います。詳しくは、後ほどみます。</p>
<h4>Room作成完了</h4>
<p>Roomの作成完了を知るには、RoomManagerEvent.CREATE_ROOM_RESULTSイベントの送出を待ちます。先ほど指定したハンドラをみていきましょう。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>541
542
543
544
545
546
547
548
549
550
551
552
553
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> _roomManager_createRoomReslutsHandler<span style="color: #000000;">&#40;</span>
				event<span style="color: #000000; font-weight: bold;">:</span>RoomManagerEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">status</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span> = event.getStatus<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			_ui.appendMessage<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;RoomManagerEvent.CREATE_ROOM_RESULTS:&quot;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #004993;">status</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>event.getStatus<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> == Status.SUCCESS
				<span style="color: #000000; font-weight: bold;">||</span> event.getStatus<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> == Status.ROOM_EXISTS<span style="color: #000000;">&#41;</span> 
			<span style="color: #000000;">&#123;</span>
				<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>_attempt == <span style="color: #990000;">&quot;observe&quot;</span><span style="color: #000000;">&#41;</span> _room.observe<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
				<span style="color: #0033ff; font-weight: bold;">else</span> <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>_attempt == <span style="color: #990000;">&quot;join&quot;</span><span style="color: #000000;">&#41;</span> _room.<span style="color: #004993;">join</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
				<span style="color: #0033ff; font-weight: bold;">else</span> <span style="color: #004993;">activate</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #000000;">&#125;</span>
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>作成の結果はevent.getStaus()の値を確認します。下記のいずれかの値をとります。</p>
<ul>
<li>Status.SUCCESS</li>
<li>Status.ROOM_EXIST</li>
<li>Status.ERROR</li>
</ul>
<p>作成に成功した場合は、Status.SUCCESSとなります。今回の場合は、Roomの自動削除を無効としているので、Status.ROOM_EXISTとなる状況が多いと思います。いずれもroomへの接続が可能な状態を示します。</p>
<p>初回は、_attemptの値は空文字なので</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>119
120
121
122
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #3f5fbf;">/**
		 * join or observe
		 */</span>
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">var</span> _attempt<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span> = <span style="color: #990000;">&quot;&quot;</span>;</pre></td></tr></table></div>

<p>次に実行されるのは、activate()メソッドです。_attemptの値がobseverの場合は、_room.observe()メソッドの実行、_attemptの値がjoinの場合は、_room.join()メソッドの実行となることを心に留めておきましょう。</p>
<p>なぜこのような作りとしているかは後ほど説明します。</p>
<h4>activate()メソッドでユーザーインターフェースの活性化</h4>
<p>activate()メソッドを実行する段階では、Union Serverとの接続が確立されてユーザのイベントを待つ状態となります。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> <span style="color: #004993;">activate</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			_ui.stopLoading<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #009900;">// observeボタンの動作を登録します。</span>
			_ui.observeButton.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">MouseEvent</span>.<span style="color: #004993;">CLICK</span>,
				 _ui_observeButton_clickHandler<span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #009900;">// joinボタンの動作を登録します。</span>
			_ui.joinButton.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">MouseEvent</span>.<span style="color: #004993;">CLICK</span>,
				 _ui_joinButton_clickHandler<span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #009900;">// updateボタンの動作を登録します。</span>
			_ui.updateButton.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">MouseEvent</span>.<span style="color: #004993;">CLICK</span>,
				 _ui_updateButton_clickHandler<span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #009900;">// メッセージ入力時の動作を登録します。</span>
			_ui.messageField.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">TextEvent</span>.<span style="color: #004993;">TEXT_INPUT</span>,
				_ui_messageField_textInputHandler<span style="color: #000000;">&#41;</span>;
			_ui.messageField.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">KeyboardEvent</span>.<span style="color: #004993;">KEY_UP</span>,
				_ui_messageField_keyUpHandler<span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #009900;">// アバターフィールドクリック時の動作を登録します。</span>
			_ui.avatarField.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">MouseEvent</span>.<span style="color: #004993;">CLICK</span>,
				_ui_avatarField_clickHandler<span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>先ほど確認したユーザーインターフェースの各プロパティにマウスイベントやテキスト入力時のイベントを設定しています。</p>
<h5>observeボタンの動作</h5>
<p>L:384で、ReadyEvent.READYイベントのハンドラで登録した、RoomEventのリスナーを解除します。L:381で_attemptにobserveを代入してから、connectメソッドを実行します。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>376
377
378
379
380
381
382
383
384
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> _ui_observeButton_clickHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">MouseEvent</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			_ui.playLoading<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			removeRoomEventListeners<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #004993;">deactivate</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			_attempt = <span style="color: #990000;">&quot;observe&quot;</span>;
			_reactor.disconnect<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #004993;">connect</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>これは、先ほど見たとおり、_roomManager_createRoomReslutsHandler内で、下記のように_room.observe()を実行することになります。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>549
550
551
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">				<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>_attempt == <span style="color: #990000;">&quot;observe&quot;</span><span style="color: #000000;">&#41;</span> _room.observe<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
				<span style="color: #0033ff; font-weight: bold;">else</span> <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>_attempt == <span style="color: #990000;">&quot;join&quot;</span><span style="color: #000000;">&#41;</span> _room.<span style="color: #004993;">join</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
				<span style="color: #0033ff; font-weight: bold;">else</span> <span style="color: #004993;">activate</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;</pre></td></tr></table></div>

<h5>joinボタンの動作</h5>
<p>observeとの違いは、_attemptにjoinを代入する点です。このような処理は、本来ならば１つの関数にまとめたほうが良いかも知れません。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>390
391
392
393
394
395
396
397
398
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> _ui_joinButton_clickHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">MouseEvent</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			_ui.playLoading<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			removeRoomEventListeners<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #004993;">deactivate</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			_attempt = <span style="color: #990000;">&quot;join&quot;</span>;
			_reactor.disconnect<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #004993;">connect</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>何度も見てきたように、_roomManager_createRoomReslutsHandler内で、下記のように_room.join()を実行することになります。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>549
550
551
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">				<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>_attempt == <span style="color: #990000;">&quot;observe&quot;</span><span style="color: #000000;">&#41;</span> _room.observe<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
				<span style="color: #0033ff; font-weight: bold;">else</span> <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>_attempt == <span style="color: #990000;">&quot;join&quot;</span><span style="color: #000000;">&#41;</span> _room.<span style="color: #004993;">join</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
				<span style="color: #0033ff; font-weight: bold;">else</span> <span style="color: #004993;">activate</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;</pre></td></tr></table></div>

<p>つまり、observe、joinするたびにReactorとUnion Serverの接続を繋ぎなおしています。</p>
<h6>Union Serverの接続を繋ぎなおす理由</h6>
<p>Union alpha3では、一度observeしたRoomに対してjoinしたり、いったんstopObservingしてからjoin。もしくはその逆を行うと、RoomEventが正常にdispatchされないなど動作が不安定となるようです。</p>
<p>そのため、observeとjoinの切り替え時にコネクションを張りなおす処理を行っています。</p>
<h5>updateボタンの動作</h5>
<p>ClientのAttributeを更新する処理です。L:413, L:414で自身のClientインスタンスのsetAttribute()メソッドを呼び出します。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>404
405
406
407
408
409
410
411
412
413
414
415
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> _ui_updateButton_clickHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">MouseEvent</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #6699cc; font-weight: bold;">var</span> nickname<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span> = _ui.nicknameField.<span style="color: #004993;">text</span>;
			<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">color</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">uint</span> = _ui.colorChooser.<span style="color: #004993;">value</span>;
			<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>nickname.<span style="color: #004993;">length</span> == <span style="color: #000000; font-weight:bold;">0</span><span style="color: #000000;">&#41;</span>
			<span style="color: #000000;">&#123;</span>
				_ui.appendMessage<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;ニックネームは空に出来ません&quot;</span>, 0xFF0000<span style="color: #000000;">&#41;</span>;
				<span style="color: #0033ff; font-weight: bold;">return</span>;
			<span style="color: #000000;">&#125;</span>
			_self.setAttribute<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;nickname&quot;</span>, <span style="color: #004993;">encodeURI</span><span style="color: #000000;">&#40;</span>nickname<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
			_self.setAttribute<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;color&quot;</span>, <span style="color: #004993;">String</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">color</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<h5>メッセージ入力時の動作</h5>
<p>TextFieldで入力した文字をエンターキーで抽出します。KeyboardEvent.KEY_UPのハンドラ内で、Keyboard.ENTER判定をするだけだと、日本語入力の変換時のエンターキー入力を拾ってしまい、入力途中で文章が抽出されてしまいます。<br />
そこで、文字入力中かどうかを判定するためにTextEvent.TEXT_INPUTのハンドラを活用します。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>421
422
423
424
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> _ui_messageField_textInputHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">TextEvent</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			_isInputText = <span style="color: #0033ff; font-weight: bold;">true</span>;
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>L:441でRoomインスタンスのsetMessage()メソッドを使ってchatMessageというMessageを送信しています。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>430
431
432
433
434
435
436
437
438
439
440
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> _ui_messageField_keyUpHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">KeyboardEvent</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>_ui.messageField.<span style="color: #004993;">text</span>.<span style="color: #004993;">length</span> == <span style="color: #000000; font-weight:bold;">0</span><span style="color: #000000;">&#41;</span> <span style="color: #0033ff; font-weight: bold;">return</span>;
			<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #000000; font-weight: bold;">!</span>_isInputText <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> event.<span style="color: #004993;">keyCode</span> == <span style="color: #004993;">Keyboard</span>.<span style="color: #004993;">ENTER</span><span style="color: #000000;">&#41;</span>
			<span style="color: #000000;">&#123;</span>
				<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">message</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span> = <span style="color: #004993;">encodeURI</span><span style="color: #000000;">&#40;</span>_ui.messageField.<span style="color: #004993;">text</span><span style="color: #000000;">&#41;</span>;
				_room.sendMessage<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;chatMessage&quot;</span>, <span style="color: #0033ff; font-weight: bold;">true</span>, <span style="color: #0033ff; font-weight: bold;">null</span>, <span style="color: #004993;">message</span><span style="color: #000000;">&#41;</span>;
				_ui.messageField.<span style="color: #004993;">text</span> = <span style="color: #990000;">&quot;&quot;</span>;
			<span style="color: #000000;">&#125;</span>
			_isInputText = <span style="color: #0033ff; font-weight: bold;">false</span>;
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<h5>アバターフィールドクリック時の動作</h5>
<p>クリックされた場所とアバターの位置関係と距離計算して、アバターが向くべき方向を決定します。L:475で自身のClientインスタンスのsetAttribute()メソッドを呼び出します。これらの値は同時にAttributeの更新イベントを通知して欲しいので１つのAttributeにカンマ区切りで代入しています。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> _ui_avatarField_clickHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">MouseEvent</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #009900;">// 入室していなければ何もしない。</span>
			<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #000000; font-weight: bold;">!</span>_self.isInRoom<span style="color: #000000;">&#40;</span>ROOM_CHAT<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> <span style="color: #0033ff; font-weight: bold;">return</span>;
&nbsp;
			<span style="color: #6699cc; font-weight: bold;">var</span> avatar<span style="color: #000000; font-weight: bold;">:*</span> = _avatars<span style="color: #000000;">&#91;</span>_self.getClientID<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>;
			<span style="color: #6699cc; font-weight: bold;">var</span> direction<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">uint</span>;
			<span style="color: #6699cc; font-weight: bold;">var</span> distanceX<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Number</span> = event.<span style="color: #004993;">localX</span> <span style="color: #000000; font-weight: bold;">-</span> avatar.<span style="color: #004993;">x</span>;
			<span style="color: #6699cc; font-weight: bold;">var</span> distanceY<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Number</span> = event.<span style="color: #004993;">localY</span> <span style="color: #000000; font-weight: bold;">-</span> avatar.<span style="color: #004993;">y</span>;
			<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">distance</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Number</span> = <span style="color: #004993;">Math</span>.<span style="color: #004993;">sqrt</span><span style="color: #000000;">&#40;</span>
				distanceX <span style="color: #000000; font-weight: bold;">*</span> distanceX <span style="color: #000000; font-weight: bold;">+</span> distanceY <span style="color: #000000; font-weight: bold;">*</span> distanceY
			<span style="color: #000000;">&#41;</span>;
			<span style="color: #009900;">// 小数点を切り捨てる</span>
			<span style="color: #004993;">distance</span> = <span style="color: #004993;">int</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">distance</span><span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #009900;">// アバターが向く方向を決定</span>
			<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #004993;">Math</span>.<span style="color: #004993;">abs</span><span style="color: #000000;">&#40;</span>distanceX<span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">&lt;</span>= <span style="color: #004993;">Math</span>.<span style="color: #004993;">abs</span><span style="color: #000000;">&#40;</span>distanceY<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
			<span style="color: #000000;">&#123;</span>
				<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>distanceY <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000; font-weight:bold;">0</span><span style="color: #000000;">&#41;</span> direction = DIRECTION_UP;
				<span style="color: #0033ff; font-weight: bold;">else</span> direction = DIRECTION_DOWN;
			<span style="color: #000000;">&#125;</span>
			<span style="color: #0033ff; font-weight: bold;">else</span>
			<span style="color: #000000;">&#123;</span>
				<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>distanceX <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000; font-weight:bold;">0</span><span style="color: #000000;">&#41;</span> direction = DIRECTION_LEFT;
				<span style="color: #0033ff; font-weight: bold;">else</span> direction = DIRECTION_RIGHT;
			<span style="color: #000000;">&#125;</span>
&nbsp;
			<span style="color: #009900;">// Client Attributeを更新する。</span>
			<span style="color: #6699cc; font-weight: bold;">var</span> values<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Array</span> = <span style="color: #000000;">&#91;</span>event.localX<span style="color: #000000; font-weight: bold;">-</span><span style="color: #000000; font-weight:bold;">16</span>, event.localY<span style="color: #000000; font-weight: bold;">-</span><span style="color: #000000; font-weight:bold;">16</span>, direction, <span style="color: #004993;">distance</span><span style="color: #000000;">&#93;</span>;
			_self.setAttribute<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;avatar&quot;</span>, values.<span style="color: #004993;">join</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;,&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<h4>addRoomEventListeners</h4>
<p>joinボタン、observeボタンをクリックした後、ReactorEvent.READYイベントが送出された段階で呼び出される_reactor_readyHandler内で実行しているメソッドです。</p>
<p>RoomEventの各イベントをリスナー登録します。ReactorとUnion Serverとをつなぐ要とも言える処理です。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> addRoomEventListeners<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			_room.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>RoomEvent.OBSERVE, _room_observeHandler<span style="color: #000000;">&#41;</span>;
			_room.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>RoomEvent.JOIN, _room_joinHandler<span style="color: #000000;">&#41;</span>;
			_room.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>RoomEvent.CLIENT_COUNT
				, _room_clientCountHandler<span style="color: #000000;">&#41;</span>;
			_room.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>RoomEvent.SYNCHRONIZE
				, _room_synchronizeHandler<span style="color: #000000;">&#41;</span>;
			_room.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>RoomEvent.ADD_CLIENT
				, _room_addClientHandler<span style="color: #000000;">&#41;</span>;
			_room.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>RoomEvent.REMOVE_CLIENT
				, _room_removeClientHandler<span style="color: #000000;">&#41;</span>;
			_room.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>RoomEvent.UPDATE_CLIENT_ATTRIBUTE
				, _room_updateClientAttributeHandler<span style="color: #000000;">&#41;</span>;
			_room.addMessageListener<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;chatMessage&quot;</span>, chatMessageHandler<span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>各イベントと登録されたハンドラ内の処理をみていきます。</p>
<h5>RoomEvent.OBSERVEとそのハンドラ</h5>
<p>RoomEvent.OBSERVEはRoomインスタンスのobserveが完了すると、Roomインスタンスから送出されるイベントです。</p>
<p>activate()メソッドでユーザーインターフェースの活性化を行います。詳細は前述の通りです。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>569
570
571
572
573
574
575
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> _room_observeHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span>RoomEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			_ui.currentStatusLabel.<span style="color: #004993;">text</span> = <span style="color: #990000;">&quot;observe&quot;</span>;
			_ui.appendMessage<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;RoomEvent.OBSERVER&quot;</span><span style="color: #000000;">&#41;</span>;
			_ui.stopLoading<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #004993;">activate</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<h5>RoomEvent.JOINとそのハンドラ</h5>
<p>RoomEvent.JOINはRoomインスタンスのjoinが完了すると、Roomインスタンスから送出されるイベントです。</p>
<p>activate()メソッドでユーザーインターフェースの活性化を行います。詳細は前述の通りです。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>580
581
582
583
584
585
586
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> _room_joinHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span>RoomEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			_ui.currentStatusLabel.<span style="color: #004993;">text</span> = <span style="color: #990000;">&quot;join&quot;</span>;
			_ui.appendMessage<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;RoomEvent.JOIN&quot;</span><span style="color: #000000;">&#41;</span>;
			_ui.stopLoading<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #004993;">activate</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<h5>RoomEvent.CLIENT_COUNTとそのハンドラ</h5>
<p>RoomEvent.CLIENT_COUNTはRoomにjoinしているClient数が変化すると、Roomインスタンスから送出されるイベントです。</p>
<p>RoomEventインスタンスのgetNumClients()メソッドで人数を取得します。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>592
593
594
595
596
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> _room_clientCountHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span>RoomEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			_ui.appendMessage<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;RoomEvent.CLIENT_COUNT&quot;</span><span style="color: #000000;">&#41;</span>;
			_ui.currentClientsLabel.<span style="color: #004993;">text</span> = <span style="color: #990000;">&quot;occupants:&quot;</span> <span style="color: #000000; font-weight: bold;">+</span> event.getNumClients<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;人&quot;</span>;
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<h5>RoomEvent.SYNCHRONIZEとそのハンドラ</h5>
<p>RoomEvent.SYNCHRONIZEはRoomインスタンスがUnion Serverとの同期を完了すると、Roomインスタンスから送出されるイベントです。</p>
<p>新しくjoin, observeしたClientが現状のRoom内のClientの情報などを取得する処理を記述します。今回は、すでにRoomにjoinしているClientのアバターを描画します。</p>
<p>RoomインスタンスのgetClients()メソッドを通して、Room内のClientのオブジェクトを取得する点がポイントとなります。</p>
<p>addAvatar()メソッドは後述します。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>602
603
604
605
606
607
608
609
610
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> _room_synchronizeHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span>RoomEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			_ui.appendMessage<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;RoomEvent.SYNCHRONIZE&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #0033ff; font-weight: bold;">for</span> <span style="color: #0033ff; font-weight: bold;">each</span> <span style="color: #000000;">&#40;</span><span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">client</span><span style="color: #000000; font-weight: bold;">:</span>IClient <span style="color: #0033ff; font-weight: bold;">in</span> _room.getClients<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
			<span style="color: #000000;">&#123;</span>
				addAvatar<span style="color: #000000;">&#40;</span><span style="color: #004993;">client</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #000000;">&#125;</span>
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<h5>RoomEvent.ADD_CLIENTとそのハンドラ</h5>
<p>RoomEvent.ADD_CLIENTはRoomインスタンスの新しいClientが追加されると、Roomインスタンスから送出されるイベントです。</p>
<p>現ClientがRoomにjoinまたはobserveした後にRoomにjoinしてきたClientの情報を取得します。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>616
617
618
619
620
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> _room_addClientHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span>RoomEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			_ui.appendMessage<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;RoomEvent.ADD_CLIENT&quot;</span><span style="color: #000000;">&#41;</span>;
			addAvatar<span style="color: #000000;">&#40;</span>event.getClient<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<h6>addAvatar()メソッド</h6>
<p>Loaderインスタンスを使って、外部のswfをロードします。ロード後の処理も一括で記述したかったので、無名関数をリスナー登録しています。</p>
<p>アバターのcolorメソッドにClient Attributeのcolorを代入したり、Client AttributeのavatarをAvatarに設定しています。updateAvatar()メソッドは後述します。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> addAvatar<span style="color: #000000;">&#40;</span><span style="color: #004993;">client</span><span style="color: #000000; font-weight: bold;">:</span>IClient<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">loader</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Loader</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Loader</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #004993;">loader</span>.<span style="color: #004993;">contentLoaderInfo</span>.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">Event</span>.<span style="color: #004993;">INIT</span>,
				<span style="color: #339966; font-weight: bold;">function</span><span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Event</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span> <span style="color: #000000;">&#123;</span>
					<span style="color: #6699cc; font-weight: bold;">var</span> avatar<span style="color: #000000; font-weight: bold;">:*</span> = <span style="color: #004993;">loader</span>.<span style="color: #004993;">content</span>;
					avatar.<span style="color: #004993;">color</span> = <span style="color: #004993;">client</span>.getAttribute<span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">null</span>, <span style="color: #990000;">&quot;color&quot;</span><span style="color: #000000;">&#41;</span>;
					<span style="color: #6699cc; font-weight: bold;">var</span> values<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Array</span> = <span style="color: #004993;">client</span>.getAttribute<span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">null</span>, <span style="color: #990000;">&quot;avatar&quot;</span><span style="color: #000000;">&#41;</span>.<span style="color: #004993;">split</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;,&quot;</span><span style="color: #000000;">&#41;</span>;
					updateAvatar.<span style="color: #004993;">apply</span><span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">null</span>, <span style="color: #000000;">&#91;</span>avatar, <span style="color: #0033ff; font-weight: bold;">false</span><span style="color: #000000;">&#93;</span>.<span style="color: #004993;">concat</span><span style="color: #000000;">&#40;</span>values<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
					_avatars<span style="color: #000000;">&#91;</span><span style="color: #004993;">client</span>.getClientID<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span> = avatar;
					_ui.avatarField.<span style="color: #004993;">addChild</span><span style="color: #000000;">&#40;</span>avatar<span style="color: #000000;">&#41;</span>;
				<span style="color: #000000;">&#125;</span>
			<span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #004993;">loader</span>.<span style="color: #004993;">load</span><span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">URLRequest</span><span style="color: #000000;">&#40;</span>AVATAR_URL<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<h5>RoomEvent.REMOVE_CLIENTとそのハンドラ</h5>
<p>RoomEvent.REMOVE_CLIENTはRoomインスタンスからClientが削除されると、Roomインスタンスから送出されるイベントです。</p>
<p>現ClientがRoomにjoinまたはobserveした後にRoomからleaveしたClientの情報を取得します。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>626
627
628
629
630
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> _room_removeClientHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span>RoomEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			_ui.appendMessage<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;RoomEvent.REMOVE_CLIENT&quot;</span><span style="color: #000000;">&#41;</span>;
			removeAvatar<span style="color: #000000;">&#40;</span>event.getClient<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<h6>removeAvatar()メソッド</h6>
<p>アバターフィールドから、アバターを削除します。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>289
290
291
292
293
294
295
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> removeAvatar<span style="color: #000000;">&#40;</span><span style="color: #004993;">client</span><span style="color: #000000; font-weight: bold;">:</span>IClient<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #6699cc; font-weight: bold;">var</span> avatar<span style="color: #000000; font-weight: bold;">:*</span> = _avatars<span style="color: #000000;">&#91;</span><span style="color: #004993;">client</span>.getClientID<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>;
			<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #000000; font-weight: bold;">!</span>_ui.avatarField.<span style="color: #004993;">contains</span><span style="color: #000000;">&#40;</span>avatar<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> <span style="color: #0033ff; font-weight: bold;">return</span>;
			_ui.avatarField.<span style="color: #004993;">removeChild</span><span style="color: #000000;">&#40;</span>avatar<span style="color: #000000;">&#41;</span>;
			<span style="color: #0033ff; font-weight: bold;">delete</span> _avatars<span style="color: #000000;">&#91;</span><span style="color: #004993;">client</span>.getClientID<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>;
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<h5>RoomEvent.UPDATE_CLIENT_ATTRIBUTEとそのハンドラ</h5>
<p>RoomEvent.UPDATE_CLIENT_ATTRIBUTEはRoom内のClientが自身のClient Attributeを更新すると、Roomインスタンスから送出されるイベントです。</p>
<p>Client Attributeは内部で設定される属性も存在するため、更新されたClient Attributeが意図したClient Attributeであるかを確認します。今回は、colorとavatarの更新を検知するようにしています。</p>
<p>実際にアプリケーションを実行すると、一定感覚でメッセージリストにRoomEvent.UPDATE_CLIENT_ATTRIBUTEが表示されますが、これは内部で更新されるClient Attributeです。_PINGという名前なので、おそらくClientの疎通確認用のClient Attributeだと思います。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> _room_updateClientAttributeHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span>RoomEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			_ui.appendMessage<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;RoomEvent.UPDATE_CLIENT_ATTRIBUTE&quot;</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">attribute</span><span style="color: #000000; font-weight: bold;">:</span>Attribute = event.getChangedAttr<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			_ui.appendMessage<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot; id:&quot;</span> <span style="color: #000000; font-weight: bold;">+</span> event.getClientID<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> 
				<span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;, name:&quot;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #004993;">attribute</span>.<span style="color: #004993;">name</span> 
				<span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;, oldValue:&quot;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #004993;">attribute</span>.oldValue
				<span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;, value:&quot;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #004993;">attribute</span>.<span style="color: #004993;">value</span>
			<span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #6699cc; font-weight: bold;">var</span> avatar<span style="color: #000000; font-weight: bold;">:*</span> = _avatars<span style="color: #000000;">&#91;</span>event.getClientID<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>;
			<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #000000; font-weight: bold;">!</span>avatar<span style="color: #000000;">&#41;</span> <span style="color: #0033ff; font-weight: bold;">return</span>;
			<span style="color: #0033ff; font-weight: bold;">switch</span> <span style="color: #000000;">&#40;</span><span style="color: #004993;">attribute</span>.<span style="color: #004993;">name</span><span style="color: #000000;">&#41;</span>
			<span style="color: #000000;">&#123;</span>
				<span style="color: #0033ff; font-weight: bold;">case</span> <span style="color: #990000;">&quot;color&quot;</span><span style="color: #000000; font-weight: bold;">:</span>
				<span style="color: #000000;">&#123;</span>
					avatar.<span style="color: #004993;">color</span> = <span style="color: #004993;">uint</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">attribute</span>.<span style="color: #004993;">value</span><span style="color: #000000;">&#41;</span>;
					<span style="color: #0033ff; font-weight: bold;">break</span>;
				<span style="color: #000000;">&#125;</span>
				<span style="color: #0033ff; font-weight: bold;">case</span> <span style="color: #990000;">&quot;avatar&quot;</span><span style="color: #000000; font-weight: bold;">:</span>
				<span style="color: #000000;">&#123;</span>
					<span style="color: #6699cc; font-weight: bold;">var</span> values<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Array</span> = <span style="color: #004993;">attribute</span>.<span style="color: #004993;">value</span>.<span style="color: #004993;">split</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;,&quot;</span><span style="color: #000000;">&#41;</span>;
					updateAvatar.<span style="color: #004993;">apply</span><span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">null</span>, <span style="color: #000000;">&#91;</span>avatar, <span style="color: #0033ff; font-weight: bold;">true</span><span style="color: #000000;">&#93;</span>.<span style="color: #004993;">concat</span><span style="color: #000000;">&#40;</span>values<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
					<span style="color: #0033ff; font-weight: bold;">break</span>;
				<span style="color: #000000;">&#125;</span>
			<span style="color: #000000;">&#125;</span>
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<h6>updateAvatar()メソッド</h6>
<p>Client Attribute avatarの更新を実際のアバターに適用します。アバターの向きを指定して、目的地へアバターを移動します。移動する際のモーションは、BetweenAS3を使っています。BetweenAS3は大変直感的に使える素敵ライブラリです。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> updateAvatar<span style="color: #000000;">&#40;</span>
				avatar<span style="color: #000000; font-weight: bold;">:*</span>,
				isTween<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Boolean</span>,
				positionX<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Number</span>, positionY<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Number</span>,
				direction<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">uint</span>, <span style="color: #004993;">distance</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Number</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			avatar.<span style="color: #004993;">play</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #0033ff; font-weight: bold;">switch</span> <span style="color: #000000;">&#40;</span>direction<span style="color: #000000;">&#41;</span>
			<span style="color: #000000;">&#123;</span>
				<span style="color: #0033ff; font-weight: bold;">case</span> DIRECTION_UP<span style="color: #000000; font-weight: bold;">:</span>
					avatar.back<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
					<span style="color: #0033ff; font-weight: bold;">break</span>;
				<span style="color: #0033ff; font-weight: bold;">case</span> DIRECTION_RIGHT<span style="color: #000000; font-weight: bold;">:</span>
					avatar.<span style="color: #004993;">right</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
					<span style="color: #0033ff; font-weight: bold;">break</span>;
				<span style="color: #0033ff; font-weight: bold;">case</span> DIRECTION_DOWN<span style="color: #000000; font-weight: bold;">:</span>
					avatar.front<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
					<span style="color: #0033ff; font-weight: bold;">break</span>;
				<span style="color: #0033ff; font-weight: bold;">case</span> DIRECTION_LEFT<span style="color: #000000; font-weight: bold;">:</span>
					avatar.<span style="color: #004993;">left</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
					<span style="color: #0033ff; font-weight: bold;">break</span>;
			<span style="color: #000000;">&#125;</span>
&nbsp;
			<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>isTween<span style="color: #000000;">&#41;</span>
			<span style="color: #000000;">&#123;</span>
				<span style="color: #6699cc; font-weight: bold;">var</span> tween<span style="color: #000000; font-weight: bold;">:</span>IObjectTween = BetweenAS3.tween<span style="color: #000000;">&#40;</span>
					avatar,
					<span style="color: #000000;">&#123;</span><span style="color: #004993;">x</span><span style="color: #000000; font-weight: bold;">:</span> positionX, <span style="color: #004993;">y</span><span style="color: #000000; font-weight: bold;">:</span> positionY <span style="color: #000000;">&#125;</span>,
					<span style="color: #000000;">&#123;</span><span style="color: #004993;">x</span><span style="color: #000000; font-weight: bold;">:</span> avatar.<span style="color: #004993;">x</span>, <span style="color: #004993;">y</span><span style="color: #000000; font-weight: bold;">:</span> avatar.<span style="color: #004993;">y</span> <span style="color: #000000;">&#125;</span>,
					<span style="color: #004993;">distance</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight:bold;">0.005</span>, Sine.easeOut
				<span style="color: #000000;">&#41;</span>;
				tween.<span style="color: #004993;">play</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #000000;">&#125;</span>
			<span style="color: #0033ff; font-weight: bold;">else</span>
			<span style="color: #000000;">&#123;</span>
				avatar.<span style="color: #004993;">x</span> = positionX;
				avatar.<span style="color: #004993;">y</span> = positionY;
			<span style="color: #000000;">&#125;</span>
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<h5>chatMessageのMessageイベント</h5>
<p>chatMessageというIDのMessageを受信した際のハンドラを指定します。受け取ったMessageをメッセージリストに追加しています。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>351
352
353
354
355
356
357
358
359
360
361
362
363
364
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;">		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> chatMessageHandler<span style="color: #000000;">&#40;</span>
				fromClient<span style="color: #000000; font-weight: bold;">:</span>IClient, <span style="color: #004993;">message</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #6699cc; font-weight: bold;">var</span> nickname<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span> = <span style="color: #004993;">decodeURI</span><span style="color: #000000;">&#40;</span>
				fromClient.getAttribute<span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">null</span>, <span style="color: #990000;">&quot;nickname&quot;</span><span style="color: #000000;">&#41;</span>
			<span style="color: #000000;">&#41;</span>;
			<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">color</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">uint</span> = <span style="color: #004993;">uint</span><span style="color: #000000;">&#40;</span>fromClient.getAttribute<span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">null</span>, <span style="color: #990000;">&quot;color&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #004993;">message</span> = <span style="color: #004993;">decodeURI</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">message</span><span style="color: #000000;">&#41;</span>;
			_ui.appendMessage<span style="color: #000000;">&#40;</span>
				<span style="color: #990000;">&quot;[chatMessage]&quot;</span> <span style="color: #000000; font-weight: bold;">+</span> nickname <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;(&quot;</span> <span style="color: #000000; font-weight: bold;">+</span> fromClient.getClientID<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;)&quot;</span>
				<span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;さん「&quot;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #004993;">message</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;」&quot;</span> <span style="color: #000000; font-weight: bold;">+</span> fromClient,
				<span style="color: #004993;">color</span>
			<span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<h3>まとめ</h3>
<p>さて、大変長々と説明してまいりました。お付き合い頂きありがとうございます。今回は具体的なサンプルコードでUnionを使ったアプリケーションの構築方法を紹介してきました。いかがでしたでしょうか。</p>
<p>Unionを使ったアプリケーションの作り方は、もちろん他にもあると思います。１つの例として参考にしていただければと思います。ご意見やご感想は、お気軽にコメントやtwitterでのつぶやきを頂ければと思います。</p>
<p>次回は、Union Serverをローカルにインストールしてみようと思います。</p>
<h3>関連記事</h3>
<ol>
<li><a href="http://fla.la/archives/248" title="UnionPlatform (1) 概要">UnionPlatform (1) 概要</a></li>
<li><a href="http://fla.la/archives/287" title="UnionPlatform (2) 概念">UnionPlatform (2) 概念</a></li>
<li><a href="http://fla.la/archives/351" title="Union Platform(3) 情報の共有化">Union Platform(3) 情報の共有化</a></li>
<li><a href="http://fla.la/archives/315" title="Union Platform(4) Reactorのイベント">Union Platform(4) Reactorのイベント</a></li>
<li><a href="http://fla.la/archives/364" title="Union Platform(5) チャットを作る">Union Platform(5) チャットを作る</a></li>
<li><a href="http://fla.la/archives/347" title="Union Platform(6) Union Server入門">Union Platform(6) Union Server入門</a></li>
<li><a href="http://fla.la/archives/365" title="Union Platform(7) Union Server Module作成準備">Union Platform(7) Union Server Module作成準備</a></li>
<li><a href="http://fla.la/archives/369" title="Union Platform(8) Moduleサンプル">Union Platform(8) Moduleサンプル</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/364/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Union Platform(4) Reactorのイベント</title>
		<link>http://fla.la/archives/315</link>
		<comments>http://fla.la/archives/315#comments</comments>
		<pubDate>Tue, 01 Sep 2009 14:42:09 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[Union Platform]]></category>

		<guid isPermaLink="false">http://fla.la/?p=315</guid>
		<description><![CDATA[Reactorの基本的なイベントを紹介します。UnionのバージョンはUnion alpha3を使用します。 ReactorのAPIドキュメントのすべてのクラスをみると、Eventの付く名前のクラスは7つあることが分かります。 順番はそれっぽい順にしてあります。 ReactorEvent ConnectionEvent ServerEvent RoomManagerEvent RoomEvent ClientEvent LogEvent 順番にみていきます。 ReactorEvent Reactorインスタンスから送出されるイベントです。 ReactorEventの使いどころ Union Serverとの接続が確立したことを知りたいとき Union Serverとの接続が切断されたことを知りたいとき var reactor:Reactor = new Reactor&#40;&#41;; reactor.addEventListener&#40;ReactorEvent.READY, reactor_readyHandler&#41;; reactor.addEventListener&#40;ReactorEvent.CLOSE, reactor_closeHandler&#41;; &#160; // addEventListenerしてからconnectします。 reactor.connect&#40;&#34;tryunion.com&#34;, 9100&#41;; &#160; function reactor_readyHandler&#40;&#41; &#123; // 接続が確立されたのでRoom作るなどします。 &#160; &#125; &#160; function reactor_closeHandler&#40;&#41; &#123; // 接続が切断されたので、ポップアップでお知らせを出す等します。 &#125; ConnectionEvent 明記されていませんが、Conenctionインスタンスから送出されるイベントと思われます。 Connectionクラス自体が直接扱うクラスではないので、内部的に使われるイベントだと思います。 ServerEvent Serverインスタンスから送出されるイベントです。 ServerEventの使いどころ Serverに接続しているClient数を知りたいとき [...]]]></description>
			<content:encoded><![CDATA[<p>Reactorの基本的なイベントを紹介します。UnionのバージョンはUnion alpha3を使用します。</p>
<p><a href="http://keno.serio.jp/union/docs/reactor/api/class-summary.html">ReactorのAPIドキュメントのすべてのクラス</a>をみると、Eventの付く名前のクラスは7つあることが分かります。<br />
順番はそれっぽい順にしてあります。</p>
<ul>
<li><a href="http://keno.serio.jp/union/docs/reactor/api/net/user1/reactor/ReactorEvent.html">ReactorEvent</a></li>
<li><a href="http://keno.serio.jp/union/docs/reactor/api/net/user1/reactor/ConnectionEvent.html">ConnectionEvent</a></li>
<li><a href="http://keno.serio.jp/union/docs/reactor/api/net/user1/reactor/ServerEvent.html">ServerEvent</a></li>
<li><a href="http://keno.serio.jp/union/docs/reactor/api/net/user1/reactor/RoomManagerEvent.html">RoomManagerEvent</a></li>
<li><a href="http://keno.serio.jp/union/docs/reactor/api/net/user1/reactor/RoomEvent.html">RoomEvent</a></li>
<li><a href="http://keno.serio.jp/union/docs/reactor/api/net/user1/reactor/ClientEvent.html">ClientEvent</a></li>
<li><a href="http://keno.serio.jp/union/docs/reactor/api/net/user1/logger/LogEvent.html">LogEvent</a></li>
</ul>
<p>順番にみていきます。</p>
<p><span id="more-315"></span></p>
<h3>ReactorEvent</h3>
<p>Reactorインスタンスから送出されるイベントです。</p>
<h4>ReactorEventの使いどころ</h4>
<ul>
<li>Union Serverとの接続が確立したことを知りたいとき</li>
<li>Union Serverとの接続が切断されたことを知りたいとき</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #6699cc; font-weight: bold;">var</span> reactor<span style="color: #000000; font-weight: bold;">:</span>Reactor = <span style="color: #0033ff; font-weight: bold;">new</span> Reactor<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
reactor.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>ReactorEvent.READY, reactor_readyHandler<span style="color: #000000;">&#41;</span>;
reactor.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>ReactorEvent.<span style="color: #004993;">CLOSE</span>, reactor_closeHandler<span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #009900;">// addEventListenerしてからconnectします。</span>
reactor.<span style="color: #004993;">connect</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;tryunion.com&quot;</span>, <span style="color: #000000; font-weight:bold;">9100</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #339966; font-weight: bold;">function</span> reactor_readyHandler<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #009900;">// 接続が確立されたのでRoom作るなどします。</span>
&nbsp;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #339966; font-weight: bold;">function</span> reactor_closeHandler<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #009900;">// 接続が切断されたので、ポップアップでお知らせを出す等します。</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<h3>ConnectionEvent</h3>
<p>明記されていませんが、Conenctionインスタンスから送出されるイベントと思われます。<br />
Connectionクラス自体が直接扱うクラスではないので、内部的に使われるイベントだと思います。</p>
<h3>ServerEvent</h3>
<p>Serverインスタンスから送出されるイベントです。</p>
<h4>ServerEventの使いどころ</h4>
<ul>
<li>Serverに接続しているClient数を知りたいとき</li>
<li>Serverの時間を取得したいとき</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #6699cc; font-weight: bold;">var</span> server<span style="color: #000000; font-weight: bold;">:</span>Server = reactor.getServer<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
server.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>ServerEvent.CLIENT_COUNT, server_clientCountHandler
server.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>ServerEvent.TIME_SYNC, server_timeSyncHandler<span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #009900;">// 既にreactorからReactorEvent.READYが送出されているとします。</span>
&nbsp;
<span style="color: #009900;">// Union Serverの応答があればServerEvent.CLIENT_COUNTを送出します</span>
server.getNumClientsOnServer<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>; 
&nbsp;
<span style="color: #009900;">// Union Serverの応答があればServerEvent.TIME_SYNCを送出します</span>
server.syncTime<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #339966; font-weight: bold;">function</span> server_clientCountHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span>ServerEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;Server clients:&quot;</span> <span style="color: #000000; font-weight: bold;">+</span> event.getNumClients<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #339966; font-weight: bold;">function</span> server_timeSyncHandler<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #009900;">// 1970年1月1日を基点としたミリ秒フォーマット</span>
    <span style="color: #009900;">// ServerEventインスタンスのプロパティから取れないあたりは</span>
    <span style="color: #009900;">// バージョンアップで変わりそうな予感がしますね。</span>
    <span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;Time is: &quot;</span> <span style="color: #000000; font-weight: bold;">+</span> Server<span style="color: #000000;">&#40;</span>event.<span style="color: #004993;">target</span><span style="color: #000000;">&#41;</span>.getServerTime<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>チャットの発言の横に出す時間とかクライアント時間なんて当てに出来ないのでこれは便利ですね。</p>
<h3>RoomManagerEvent</h3>
<p>RoomManagerインスタンスから送出されるイベントです。</p>
<h4>RoomManagerEventの使いどころ</h4>
<ul>
<li>指定したRoomのClient数を知りたいとき</li>
<li>自身のClientが作成しようとした部屋が作成できたか知りたいとき</li>
<li>特定のIDのRoomが生成されたことを知りたいとき</li>
<li>自身のClientが存在しないRoomへjoin, observe, leaveしたことを知りたいとき</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #6699cc; font-weight: bold;">var</span> roomManager<span style="color: #000000; font-weight: bold;">:</span>RoomManager = reactor.getRoomManager<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
roomManager.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>RoomManagerEvent.CLIENT_COUNT, roomManager_clientCountHandler<span style="color: #000000;">&#41;</span>;
roomManager.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>RoomManagerEvent.CREATE_ROOM_RESULTS, roomManager_createRoomResultHandler<span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #009900;">// 既にreactorからReactorEvent.READYが送出されているとします。</span>
<span style="color: #009900;">// la.fla.chat, la.fla.gameというRoomが存在しているとします。</span>
&nbsp;
<span style="color: #009900;">// la.fla.*というIDのRoomをwatchします</span>
roomManager.watchForRooms<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;la.fla.*&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #009900;">// la.fla.*内のclient数を取得します。</span>
<span style="color: #009900;">// UnionServerからの応答があれば、RoomManagerEvent.CLIENT_COUNTを送出します。</span>
roomManager.getNumClientsInRooms<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;la.fla.*&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #009900;">// la.fla.lobbyを作成します。</span>
<span style="color: #009900;">// UnionServerからの応答があれば、RoomManagerEvent.CREATE_ROOM_RESULTS</span>
roomManager.createRoom<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;la.fla.lobby&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #339966; font-weight: bold;">function</span> roomManager_clientCountHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span>RoomManagerEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #009900;">// la.fla.*内のクライアント数を取得します。</span>
	<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;RoomManager clients:&quot;</span> <span style="color: #000000; font-weight: bold;">+</span> event.getNumClientsTotal<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #339966; font-weight: bold;">function</span> roomManager_createRoomResultHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span>RoomManagerEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #009900;">// 自身が作成しようとした部屋の作成結果を取得します。</span>
	<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;RoomManager create room result:&quot;</span> <span style="color: #000000; font-weight: bold;">+</span> event.getStatus<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>la.fla.*のような指定をすることで、特定のグループのRoomの人数を知ることが出来ます。<br />
チャットの部屋とロビーの関係をla.fla.chat, la.fla.chat.room01, la.fla.chat.room02などとすると管理しやすそうですね。</p>
<h3>RoomEvent</h3>
<p>Roomインスタンスから送出されるイベントです。</p>
<h4>RoomEventの使いどころ</h4>
<p>以下のRoomとはRoomEventを送出したRoomインスタンスを示します。</p>
<ul>
<li>自分自身のClientがRoomに無事join, leave, observe完了したことを知りたいとき</li>
<li>別のClientがRoomにがjoin, leave, observeしたことを知りたいとき</li>
<li>Roomに入室、観察しているClient数の変化を知りたいとき</li>
<li>Room内のClientがClient Attributeを更新、削除したことを知りたいとき</li>
<li>誰かがRoom Attributeが更新、削除したことを知りたいとき</li>
<li>Room入室時に現在の状況を知りたいとき</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #6699cc; font-weight: bold;">var</span> room<span style="color: #000000; font-weight: bold;">:</span>Room = roomManager.createRoom<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;la.fla.lobby&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
room.addEevntListener<span style="color: #000000;">&#40;</span>RoomEvent.JOIN, room_joinHandler<span style="color: #000000;">&#41;</span>;
room.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>RoomEvent.ADD_CLIENT, room_addClientHandler<span style="color: #000000;">&#41;</span>;
room.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>RoomEvent.REMOVE_CLIENT, room_removeClientHandler<span style="color: #000000;">&#41;</span>;
room.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>RoomEvent.UPDATE_CLIENT_ATTRIBUTE, room_updateClientAttributeHandler<span style="color: #000000;">&#41;</span>;
room.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>RoomEvent.UPDATE_ROOM_ATTRIBUTE, room_updateRoomAttributeHandler<span style="color: #000000;">&#41;</span>;
room.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>RoomEvent.SYNCHRONIZE, room_synchronizeHandler<span style="color: #000000;">&#41;</span>;
&nbsp;
&nbsp;
<span style="color: #009900;">// 既にroomManagerからRoomManagerEvent.CREATE_ROOM_RESULTSが送出されているとします。</span>
&nbsp;
<span style="color: #009900;">// UnionServerからの応答があれば、RoomEvent.JOINを送出します。</span>
room.<span style="color: #004993;">join</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #339966; font-weight: bold;">function</span> room_joinHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span>RoomEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;ルームに無事入室できました。&quot;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #339966; font-weight: bold;">function</span> room_addClientHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span>RoomEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;ルームに別のClientが入室しました。&quot;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #339966; font-weight: bold;">function</span> room_removeClientHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span>RoomEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;ルームから別のClientが退室しました。&quot;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #339966; font-weight: bold;">function</span> room_updateClientAttributeHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span>RoomEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">attribute</span><span style="color: #000000; font-weight: bold;">:</span>Attribute = event.getChangedAttr<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
	<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #004993;">attribute</span>.<span style="color: #004993;">name</span> == <span style="color: #990000;">&quot;_PING&quot;</span><span style="color: #000000;">&#41;</span> <span style="color: #0033ff; font-weight: bold;">return</span>;
&nbsp;
	<span style="color: #009900;">// Client Attributeを更新したClientを表します。</span>
	<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">client</span><span style="color: #000000; font-weight: bold;">:</span>IClient = event.getClient<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
	<span style="color: #6699cc; font-weight: bold;">var</span> clientID<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span> = event.getClientID<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
	<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span>
		  clientID 
		<span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;'s (&quot;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #004993;">attribute</span>.scope <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;)&quot;</span>
		<span style="color: #000000; font-weight: bold;">+</span> <span style="color: #004993;">attribute</span>.<span style="color: #004993;">name</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot; was changed &quot;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #004993;">attribute</span>.oldValue
		<span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot; to &quot;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #004993;">attribute</span>.<span style="color: #004993;">value</span>
	<span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #339966; font-weight: bold;">function</span> room_updateRoomAttributeHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span>RoomEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">attribute</span><span style="color: #000000; font-weight: bold;">:</span>Attribute = event.getChangedAttr<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
	<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span>
		  <span style="color: #004993;">attribute</span>.<span style="color: #004993;">name</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot; was changed &quot;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #004993;">attribute</span>.oldValue
		<span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot; to &quot;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #004993;">attribute</span>.<span style="color: #004993;">value</span>
	<span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #339966; font-weight: bold;">function</span> room_synchronizeHandler<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span>RoomEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">client</span><span style="color: #000000; font-weight: bold;">:</span>IClient;
	<span style="color: #0033ff; font-weight: bold;">for</span> <span style="color: #0033ff; font-weight: bold;">each</span> <span style="color: #000000;">&#40;</span><span style="color: #004993;">client</span> <span style="color: #0033ff; font-weight: bold;">in</span> _room.getClients<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		<span style="color: #009900;">// 既に入室しているClientのClient Attributeなどを取得する</span>
	<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Union Platformでアプリケーションを作る際の核となるのは、このRoomEventとMessagesのイベントだと思います。<br />
これらのイベント発生するイベントがユーザの視覚的な体験となるんですね。</p>
<h3>ClientEvent</h3>
<p>Clientインスタンスから送出されるイベントです。</p>
<h4>ClientEventの使いどころ</h4>
<ul>
<li>特定ClientのRoomへのjoin、leaveを知りたいとき</li>
<li>特定ClientのClient Attributeの更新を知りたいとき</li>
</ul>
<h3>LogEvent</h3>
<p>Loggerインスタンスから送出されるイベントです。</p>
<h3>Messageのイベント</h3>
<p>Messageのイベントはイベント用のインスタンスは生成されず、リスナー登録の引数やハンドラの引数が独自のものとなっています。<br />
<a href="http://fla.la/archives/351">情報の共有化</a>でもみたようにMessageは以下のAPIから送信されます。</p>
<ul>
<li>Server APIによるMessage</li>
<li>RoomManager APIによるMessage</li>
<li>Room APIによるMessage</li>
<li>ClientManager APIによるMessage</li>
<li>Client APIによるMessage</li>
<li>Union ServerからのMessage</li>
</ul>
<h4>Messageイベントの使いどころ</h4>
<p><a href="http://fla.la/archives/351">情報の共有化</a>でみてきた様なMessageの受信時に使います。</p>
<h5>Server APIによるMessage</h5>
<p>Serverに接続している全ClientへMessageを送信したい場合に使用します。</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #009900;">// 既にroomからRoomEvent.JOINが送出されているとします。</span>
&nbsp;
reactor.getMessageManager<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.addMessageListener<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;MESSAGE_ID&quot;</span>, messageHandler<span style="color: #000000;">&#41;</span>;
&nbsp;
&nbsp;
<span style="color: #009900;">// MESSAGE_IDというMessageを送信します。</span>
<span style="color: #009900;">// Union Serverから応答があれば、先にひもづけたmessageHandlerが呼ばれます。</span>
server.sendMessage<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;MESSAGE_ID&quot;</span>, <span style="color: #0033ff; font-weight: bold;">true</span>, <span style="color: #0033ff; font-weight: bold;">null</span>, <span style="color: #990000;">&quot;param1&quot;</span>, <span style="color: #990000;">&quot;param2&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
&nbsp;
<span style="color: #339966; font-weight: bold;">function</span> messageHandler<span style="color: #000000;">&#40;</span>fromClient<span style="color: #000000; font-weight: bold;">:</span>IClient, param1, param2<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span>fromClient.getClientID<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;から&quot;</span> 
		<span style="color: #000000; font-weight: bold;">+</span> param1 <span style="color: #000000; font-weight: bold;">+</span><span style="color: #990000;">&quot;と&quot;</span> <span style="color: #000000; font-weight: bold;">+</span>param2 <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;を受け取りました。&quot;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>

<h5>RoomManager APIによるMessage</h5>
<p>指定したRoomに入室しているClientへMessageを送信したい場合に使用します。</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #009900;">// 既にroomからRoomEvent.JOINが送出されているとします。</span>
&nbsp;
reactor.getMessageManager<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.addMessageListener<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;MESSAGE_ID&quot;</span>, messageHandler<span style="color: #000000;">&#41;</span>;
&nbsp;
&nbsp;
<span style="color: #009900;">// Room ID chat, game へ MESSAGE_IDというMessageを送信します。</span>
<span style="color: #009900;">// Union Serverから応答があれば、先にひもづけたmessageHandlerが呼ばれます。</span>
roomManager.sendMessage<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;MESSAGE_ID&quot;</span>, <span style="color: #000000;">&#91;</span><span style="color: #990000;">&quot;chat&quot;</span>, <span style="color: #990000;">&quot;game&quot;</span><span style="color: #000000;">&#93;</span>, <span style="color: #0033ff; font-weight: bold;">true</span>, <span style="color: #0033ff; font-weight: bold;">null</span>, <span style="color: #990000;">&quot;param1&quot;</span>, <span style="color: #990000;">&quot;param2&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
&nbsp;
<span style="color: #339966; font-weight: bold;">function</span> messageHandler<span style="color: #000000;">&#40;</span>fromClient<span style="color: #000000; font-weight: bold;">:</span>IClient, toRoom<span style="color: #000000; font-weight: bold;">:</span>Room, param1, param2<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span>fromClient.getClientID<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;から&quot;</span> 
		<span style="color: #000000; font-weight: bold;">+</span> param1 <span style="color: #000000; font-weight: bold;">+</span><span style="color: #990000;">&quot;と&quot;</span> <span style="color: #000000; font-weight: bold;">+</span>param2 <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;を受け取りました。&quot;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>

<h5>Room APIによるMessage</h5>
<p>現在Roomに入室しているClientへMessageを送信したい場合に使用します。</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #009900;">// 既にroomからRoomEvent.JOINが送出されているとします。</span>
&nbsp;
room.addMessageListener<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;MESSAGE_ID&quot;</span>, messageHandler<span style="color: #000000;">&#41;</span>;
&nbsp;
&nbsp;
<span style="color: #009900;">// MESSAGE_IDというMessageを送信します。</span>
<span style="color: #009900;">// Union Serverから応答があれば、先にひもづけたmessageHandlerが呼ばれます。</span>
room.sendMessage<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;MESSAGE_ID&quot;</span>, <span style="color: #0033ff; font-weight: bold;">true</span>, <span style="color: #0033ff; font-weight: bold;">null</span>, <span style="color: #990000;">&quot;param1&quot;</span>, <span style="color: #990000;">&quot;param2&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
&nbsp;
<span style="color: #339966; font-weight: bold;">function</span> messageHandler<span style="color: #000000;">&#40;</span>fromClient<span style="color: #000000; font-weight: bold;">:</span>IClient, param1, param2<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span>fromClient.getClientID<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;から&quot;</span> 
		<span style="color: #000000; font-weight: bold;">+</span> param1 <span style="color: #000000; font-weight: bold;">+</span><span style="color: #990000;">&quot;と&quot;</span> <span style="color: #000000; font-weight: bold;">+</span>param2 <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;を受け取りました。&quot;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>

<h5>ClientManager APIによるMessage</h5>
<p>指定したClientへMessageを送信したい場合に使用します。</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #009900;">// 既にroomからRoomEvent.JOINが送出されているとします。</span>
&nbsp;
reactor.getMessageManager<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.addMessageListener<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;MESSAGE_ID&quot;</span>, messageHandler<span style="color: #000000;">&#41;</span>;
&nbsp;
&nbsp;
<span style="color: #009900;">// Client ID 123, 124へMESSAGE_IDというMessageを送信します。</span>
<span style="color: #009900;">// Union Serverから応答があれば、先にひもづけたmessageHandlerが呼ばれます。</span>
clientManager.sendMessage<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;MESSAGE_ID&quot;</span>, <span style="color: #000000;">&#91;</span><span style="color: #990000;">&quot;123&quot;</span>, <span style="color: #990000;">&quot;124&quot;</span><span style="color: #000000;">&#93;</span>, <span style="color: #0033ff; font-weight: bold;">null</span>, <span style="color: #990000;">&quot;param1&quot;</span>, <span style="color: #990000;">&quot;param2&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
&nbsp;
<span style="color: #339966; font-weight: bold;">function</span> messageHandler<span style="color: #000000;">&#40;</span>fromClient<span style="color: #000000; font-weight: bold;">:</span>IClient, param1, param2<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span>fromClient.getClientID<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;から&quot;</span> 
		<span style="color: #000000; font-weight: bold;">+</span> param1 <span style="color: #000000; font-weight: bold;">+</span><span style="color: #990000;">&quot;と&quot;</span> <span style="color: #000000; font-weight: bold;">+</span>param2 <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;を受け取りました。&quot;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>

<h5>Client APIによるMessage</h5>
<p>特定のClientへMessageを送信したい場合に使用します。</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #009900;">// 既にroomからRoomEvent.JOINが送出されているとします。</span>
&nbsp;
<span style="color: #6699cc; font-weight: bold;">var</span> self<span style="color: #000000; font-weight: bold;">:</span>IClient = reactor.getClientManager<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.self<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
self.addMessageListener<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;MESSAGE_ID&quot;</span>, messageHandler<span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">client</span><span style="color: #000000; font-weight: bold;">:</span>IClient = _room.getClients<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;123&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #009900;">// MESSAGE_IDというMessageを送信します。</span>
<span style="color: #009900;">// Union Serverから応答があれば、先にひもづけたmessageHandlerが呼ばれます。</span>
<span style="color: #004993;">client</span>.sendMessage<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;MESSAGE_ID&quot;</span>, <span style="color: #990000;">&quot;param1&quot;</span>, <span style="color: #990000;">&quot;param2&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #009900;">// 自身のClient IDが123であれば実行されます</span>
<span style="color: #339966; font-weight: bold;">function</span> messageHandler<span style="color: #000000;">&#40;</span>fromClient<span style="color: #000000; font-weight: bold;">:</span>IClient, param1, param2<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span>fromClient.getClientID<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;から&quot;</span> 
		<span style="color: #000000; font-weight: bold;">+</span> param1 <span style="color: #000000; font-weight: bold;">+</span><span style="color: #990000;">&quot;と&quot;</span> <span style="color: #000000; font-weight: bold;">+</span>param2 <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;を受け取りました。&quot;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>

<h3>まとめ</h3>
<p>基本的なイベントの使いどころをみてきたので、もうアプリを作ることが出来そうです。<br />
簡単なアプリの流れを見てみましょう。</p>
<h4>基本的なアプリの流れ</h4>
<ol>
<li>Reactorのインスタンス作成</li>
<li>ReactorEventのlisten
<ul>
<li>ReactorEvent.READY</li>
<li>ReactorEvent.CLOSE</li
		</ul>
</li>
<li>ReactorインスタンスからUnion Serverへ接続</li>
<li>ReactorインスタンスがReactorEvent.READYを送出</li>
<li>自身のClientを取得</li>
<li>自身のClient Attributeを初期化</li>
<li>RoomManagerEventのlisten
<ul>
<li>RoomManagerEvent.CLIENT_COUNT</li>
<li>RoomManagerEvent.CREATE_ROOM_RESULTS</li>
</ul>
</li>
<li>Roomインスタンスの作成</li>
<li>RoomインスタンスがRoomManagerEvent.CREATE_ROOM_RESULTSを送出</li>
<li>RoomEventのlisten
<ul>
<li>RoomEvent.JOIN</li>
<li>RoomEvent.OBSERVE</li>
<li>RoomEvent.LEAVE</li>
<li>RoomEvent.STOP_OBSERVING</li>
<li>RoomEvent.CLIENT_COUNT</li>
<li>RoomEvent.UPDATE_CLIENT_ATTRIBUTE</li>
<li>RoomEvent.DELETE_CLIENT_ATTRIBUTE</li>
<li>RoomEvent.UPDATE_ROOM_ATTRIBUTE</li>
<li>RoomEvent.DELETE_CLIENT_ATTRIBUTE</li>
<li>RoomEvent.SYNCHRONIZE</li>
</ul>
</li>
<li>Roomインスタンスの接続(join or observe)</li>
<li>RoomインスタンスがRoomEvent.JOIN or RoomEvent.OBSERVEを送出</li>
<li>RoomインスタンスがRoomEvent.SYNCHRONIZEを送出</li>
</ol>
<p>もちろん、他にも今回見てきたイベントのリッスンを挟み込むことで色々なアプリケーションが作れます。<br />
次回は、マルチアプリケーションの定番であるチャットアプリケーションを作ってみます。</p>
<h3>関連記事</h3>
<ol>
<li><a href="http://fla.la/archives/248" title="UnionPlatform (1) 概要">UnionPlatform (1) 概要</a></li>
<li><a href="http://fla.la/archives/287" title="UnionPlatform (2) 概念">UnionPlatform (2) 概念</a></li>
<li><a href="http://fla.la/archives/351" title="Union Platform(3) 情報の共有化">Union Platform(3) 情報の共有化</a></li>
<li><a href="http://fla.la/archives/315" title="Union Platform(4) Reactorのイベント">Union Platform(4) Reactorのイベント</a></li>
<li><a href="http://fla.la/archives/364" title="Union Platform(5) チャットを作る">Union Platform(5) チャットを作る</a></li>
<li><a href="http://fla.la/archives/347" title="Union Platform(6) Union Server入門">Union Platform(6) Union Server入門</a></li>
<li><a href="http://fla.la/archives/365" title="Union Platform(7) Union Server Module作成準備">Union Platform(7) Union Server Module作成準備</a></li>
<li><a href="http://fla.la/archives/369" title="Union Platform(8) Moduleサンプル">Union Platform(8) Moduleサンプル</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/315/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Union Platform(3) 情報の共有化</title>
		<link>http://fla.la/archives/351</link>
		<comments>http://fla.la/archives/351#comments</comments>
		<pubDate>Mon, 31 Aug 2009 01:08:30 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[Union Platform]]></category>

		<guid isPermaLink="false">http://fla.la/?p=351</guid>
		<description><![CDATA[さて、Unionの醍醐味は、他のユーザと情報を共有するところにあると考えます。 前回みたように、情報の共有化にはいくつかの方法があることが分かりました。今回は、その手段の使いどころ整理してみます。UnionのバージョンはUnion alpha3を使用します。 どんな手段があるのか 情報の共有化は大きく分けて、Attributeによる共有とMessageによる共有に分けることが出来ます。 Attributeによる共有は、RoomのAttributeとClientのAtrributeがあります。 Messageによる共有は、Room(RoomManager) APIによるMessageとClient(ClientManager) APIによるMessageがあります。また、Union ServerからMessageを送信することも可能です。 まとめると以下のようになります。 Attributeによる共有 Room Attribute Client Attribute Messageによる共有 Server APIによるMessage RoomManager APIによるMessage Room APIによるMessage ClientManager APIによるMessage Client APIによるMessage Union ServerからのMessage 各手段の特徴と使いどころ 次に先ほどの、情報の共有化手段の特徴と使いどころを考えて見ます。 Attributeによる共有 Room Attribute Roomに対する属性の変更は、Roomに接続(join, observe)しているClientすべてに通知されます。よって、Roomに接続(join, observe)しているすべてのClientで共有したい情報はRoom Attributeを使います。ただし、ClientはRoom Attributeの通知を拒否する事も出来ます。 例えば、チャットを開催するRoomを考えます。チャット部屋の背景の色は参加者全員で共有すべき情報なので、Room Attributeを使うと良いでしょう。また、チャット内の話題や、発言回数、ビジュアル的な背景などの設定もRoom Attributeに適しています。 このRoom Attributeは、途中からRoomに接続したClientに対しては最新の情報が共有されます。たとえば、以下のようなシチュエーションが考えられます。 Room Attribute backgroundはred Client Aがbackgroundをorangeに変更し、Client AとClient BにRoom Attributeのbackgroundがorangeへ更新されたことが通知される。 Client Bがbackgroundをblueに変更し、Client AとClient [...]]]></description>
			<content:encoded><![CDATA[<p>さて、Unionの醍醐味は、他のユーザと情報を共有するところにあると考えます。<br />
前回みたように、情報の共有化にはいくつかの方法があることが分かりました。今回は、その手段の使いどころ整理してみます。UnionのバージョンはUnion alpha3を使用します。</p>
<h3>どんな手段があるのか</h3>
<p>情報の共有化は大きく分けて、Attributeによる共有とMessageによる共有に分けることが出来ます。</p>
<p>Attributeによる共有は、RoomのAttributeとClientのAtrributeがあります。</p>
<p>Messageによる共有は、Room(RoomManager) APIによるMessageとClient(ClientManager) APIによるMessageがあります。また、Union ServerからMessageを送信することも可能です。</p>
<p>まとめると以下のようになります。</p>
<ul>
<li>Attributeによる共有
<ul>
<li>Room Attribute</li>
<li>Client Attribute</li>
</ul>
</li>
<li>Messageによる共有
<ul>
<li>Server APIによるMessage</li>
<li>RoomManager APIによるMessage</li>
<li>Room APIによるMessage</li>
<li>ClientManager APIによるMessage</li>
<li>Client APIによるMessage</li>
<li>Union ServerからのMessage</li>
</ul>
</li>
</ul>
<p><span id="more-351"></span></p>
<h3>各手段の特徴と使いどころ</h3>
<p>次に先ほどの、情報の共有化手段の特徴と使いどころを考えて見ます。</p>
<h4>Attributeによる共有</h4>
<h5>Room Attribute</h5>
<p>Roomに対する属性の変更は、Roomに接続(join, observe)しているClientすべてに通知されます。よって、Roomに接続(join, observe)しているすべてのClientで共有したい情報はRoom Attributeを使います。ただし、ClientはRoom Attributeの通知を拒否する事も出来ます。</p>
<p>例えば、チャットを開催するRoomを考えます。チャット部屋の背景の色は参加者全員で共有すべき情報なので、Room Attributeを使うと良いでしょう。また、チャット内の話題や、発言回数、ビジュアル的な背景などの設定もRoom Attributeに適しています。</p>
<p>このRoom Attributeは、途中からRoomに接続したClientに対しては最新の情報が共有されます。たとえば、以下のようなシチュエーションが考えられます。</p>
<ul>
<li>Room Attribute backgroundはred</li>
<li>Client Aがbackgroundをorangeに変更し、Client AとClient BにRoom Attributeのbackgroundがorangeへ更新されたことが通知される。</li>
<li>Client Bがbackgroundをblueに変更し、Client AとClient BにRoom Attributeのbackgroundがblueへ更新されたことが通知される。</li>
<li>Client CがRoomにjoinし、Room Attributeのbackgroundがblueであることを確認する。</li>
</ul>
<p>図解すると以下のようになります。</p>
<div id="attachment_317" class="wp-caption aligncenter" style="width: 420px"><img src="http://fla.la/wp-content/uploads/2009/08/union_platform003_001.png" alt="Room Attributeの解説1" title="Room Attributeの解説1" width="410" height="481" class="size-full wp-image-317" />
<p class="wp-caption-text">Room Attribute backgroundはred</div>
<div id="attachment_318" class="wp-caption aligncenter" style="width: 420px"><img src="http://fla.la/wp-content/uploads/2009/08/union_platform003_002.png" alt="Room Attributeの解説2" title="Room Attributeの解説2" width="410" height="526" class="size-full wp-image-318" />
<p class="wp-caption-text">Client Aがbackgroundをorangeに変更し、Client AとClient BにRoom Attributeのbackgroundがorangeへ更新されたことが通知される。</div>
<div id="attachment_319" class="wp-caption aligncenter" style="width: 420px"><img src="http://fla.la/wp-content/uploads/2009/08/union_platform003_003.png" alt="Room Attributeの解説3" title="Room Attributeの解説3" width="410" height="526" class="size-full wp-image-319" />
<p class="wp-caption-text">Client Bがbackgroundをblueに変更し、Client AとClient BにRoom Attributeのbackgroundがblueへ更新されたことが通知される。</div>
<div id="attachment_320" class="wp-caption aligncenter" style="width: 420px"><img src="http://fla.la/wp-content/uploads/2009/08/union_platform003_004.png" alt="Room Attributeの解説4" title="Room Attributeの解説4" width="410" height="526" class="size-full wp-image-320" />
<p class="wp-caption-text">Client CがRoomにjoinし、Room Attributeのbackgroundがblueであることを確認する。</div>
<p>このとき、Client CはRoom Attributeが以前はred, orangeであった事を知りえません。</p>
<p>このように、画面内の最新情報を共有する際にRoom Attributeが適している事が多いです。他にも色々考えられます。</p>
<ul>
<li>ボードゲームのどのボードに何が置かれているかという情報</li>
<li>お絵描きチャットのキャンバスの情報</li>
<li>陣取りゲームでどの陣が誰の陣であるかという情報</li>
</ul>
<h5>Room Attributeの永続化</h5>
<p>また、Roomに設定されたRoom Attributeは、永続化することで次回の接続にも前回設定したRoom AttributeをUnion Serverへ保存しておく事が可能です。</p>
<p>ただ、現地点では、サーバ再起動時に永続化データは消えてしまうようです。</p>
<h4>Client Attribute</h4>
<p>Clientの持つ属性を他のClientと共有したいとき、Client Attributeを使います。Room Attributeとの違いとして、Client Attributeにはスコープという概念があります。</p>
<p>スコープは以下のようになります。</p>
<ul>
<li>グローバル</li>
<li>特定のRoom(Room IDで指定)</li>
</ul>
<p>グローバルスコープに指定したClient Attributeの更新は、該当するClientが接続(join, observe)している全Room、Clientへ通知されます。特定のRoomをスコープとするClient Attributeの更新は、特定のRoomとそのRoomに接続(join, observe)しているClientへ通知されます。</p>
<p>チャットRoomとゲームRoomが存在するアプリケーションの場合、どちらのRoomにおいてもユーザーのニックネームやキャラクターカラーという情報は必要となります。ゲームRoomでは現在のゲーム上のカーソルの位置はゲームRoomだけで必要なClient Attributeとなるでしょう。</p>
<div id="attachment_334" class="wp-caption aligncenter" style="width: 628px"><img src="http://fla.la/wp-content/uploads/2009/08/union_platform003_007.png" alt="Client Attributeのスコープ" title="Client Attributeのスコープ" width="618" height="775" class="size-full wp-image-334" />
<p class="wp-caption-text">Client Attributeのスコープ</div>
<p>上記の図で、両方のRoomに共通するニックネームとキャラの色をグローバルスコープ。ゲームRoomでのユーザのカーソル位置はゲームRoomスコープに設定します。<br />
Room Attributeと同様に、途中からRoomに接続したClientに対しては最新の情報が共有されます。</p>
<h5>Client Attributeの永続化</h5>
<p>また、Clientに設定されたClient Attributeは、永続化することで次回の接続にも前回設定したClient AttributeをUnion Serverへ保存しておく事が可能です。</p>
<p>ただ、こちらはUnion alpha3では永続化したClientデータをひもづける手段が提供されていなようなので未対応のようです。もし、情報をお持ちの方がいらっしゃいましたらご教授いただけるとうれしいです。</p>
<h4>Messageによる共有</h4>
<p>Attributeは最新の情報が共有されるため、Clientはその場に居合わせなくても最新の情報は取得できます。それに対して、Messageは、その場に居合わせた人だけが受け取れる共有情報です。</p>
<p>現実の例として、AさんとBさんが会話をしているとき、途中でやってきたCさんは今までAさんとBさんが話していた内容を知ることは出来ません。</p>
<div id="attachment_325" class="wp-caption aligncenter" style="width: 442px"><img src="http://fla.la/wp-content/uploads/2009/08/union_platform003_005.png" alt="RoomでAさんとBさんが会話中" title="RoomでAさんとBさんが会話中" width="432" height="348" class="size-full wp-image-325" />
<p class="wp-caption-text">RoomでAさんとBさんが会話中</div>
<div id="attachment_326" class="wp-caption aligncenter" style="width: 420px"><img src="http://fla.la/wp-content/uploads/2009/08/union_platform003_006.png" alt="RoomにCさんが接続" title="RoomにCさんが接続" width="410" height="348" class="size-full wp-image-326" />
<p class="wp-caption-text">RoomにCさんが接続</div>
<p>ただ、CさんはAさんかBさんに、今まで何を話していたのかを聞くことによって、今までの会話の内容を知ることが出来ます。AさんとBさんが会話をしながら、すべての記録をノートに書いていれば、後から来たCさんはそれを見ることで今までの会話の内容を知ることが出来ます。</p>
<p>同じような事をReactorで実現しようとすると、以下のような手順になります。</p>
<ul>
<li>ClientがMessageを送信する</li>
<li>Messageを受け取ったClientはその内容を配列に保存する</li>
<li>途中から新しいClientがRoomに接続する</li>
<li>新しいClientは、一番最初から要るClientに今までのMessageの結果の送信を要求するMessageを送信する</li>
<li>一番最初から要るClientは、新しいClientへ今までのMessageの結果を送信する</li>
</ul>
<h5>Server APIによるMessage</h5>
<p>Serverに接続する全Client、または特定のClient Attributeを持つClientへ共有したい情報を送信する際に利用します。</p>
<h5>RoomManager APIによるMessage</h5>
<p>指定した複数のRoomに接続する全Client、または特定のClient Attributeを持つClientへ共有したい情報を送信する際に利用します。</p>
<h5>Room APIによるMessage</h5>
<p>Roomに接続する全Client、または特定のClient Attributeを持つClientへ共有したい情報を送信する際に利用します。</p>
<h5>ClientManager APIよるMessage</h5>
<p>特定のClientに対して共有したい情報を送信する際に利用します。チャットRoom内で秘密のメッセージ交換などの利用します。</p>
<h5>Client APIよるMessage</h5>
<p>指定した複数のClientに対して共有したい情報を送信する際に利用します。チャットRoom内で秘密のメッセージ交換などの利用します。</p>
<h5>Union ServerからのMessage</h5>
<p>Union Serverでは、Server Module、Room ModuleといったModuleを定義することによって、各種イベント発生をトリガーとした、処理や、定期的な処理を作成する事が出来ます。</p>
<p>それらのModuleからMessageを送信することによって、Union ServerはRoomやClientに対してMessageを送信する事が出来ます。ReactorではRoomやClientのAPIを利用したMessageと同様に、Union ServerからのMessageを受け取る事が可能です。<br />
Union ServerのModuleを作成方法を紹介する際に具体的な実装方法を見て行きます。</p>
<h3>情報の共有化のまとめ</h3>
<p>ここまでの情報の共有化についてまとめてみます。</p>
<table class="data_table">
<caption>情報の共有化手法のまとめ</caption>
<thead>
<tr>
<th>発信元</th>
<th>API</th>
<th>方法</th>
<th>新たなユーザへの情報提供</th>
<th>情報の永続化</th>
</tr>
</thead>
<tbody>
<tr>
<td>Reactor</td>
<td><a href="http://keno.serio.jp/union/docs/reactor/api/net/user1/reactor/Room.html#setAttribute%28%29">Room.setAttribute()</a></td>
<td>Room Attribute</td>
<td>最新の情報</td>
<td>可能だがサーバ再起動で消える</td>
</tr>
<tr>
<td>Reactor</td>
<td><a href="http://keno.serio.jp/union/docs/reactor/api/net/user1/reactor/Client.html#setAttribute%28%29">Client.setAttribute()</a></td>
<td>Client Attribute</td>
<td>最新の情報</td>
<td>可能な予定だが未対応</td>
</tr>
<tr>
<td>Reactor</td>
<td><a href="http://keno.serio.jp/union/docs/reactor/api/net/user1/reactor/Server.html#sendMessage%28%29">Server.sendMessage();</a></td>
<td>Server APIによるMessage</td>
<td>次回以降の情報</td>
<td>不可</td>
</tr>
<tr>
<td>Reactor</td>
<td><a href="http://keno.serio.jp/union/docs/reactor/api/net/user1/reactor/RoomManager.html#sendMessage%28%29">RoomManager.sendMessage();</a></td>
<td>RoomManager APIによるMessage</td>
<td>次回以降の情報</td>
<td>不可</td>
</tr>
<tr>
<td>Reactor</td>
<td><a href="http://keno.serio.jp/union/docs/reactor/api/net/user1/reactor/RoomManager.html#sendMessage%28%29">RoomManager.sendMessage();</a></td>
<td>Room APIによるMessage</td>
<td>次回以降の情報</td>
<td>不可</td>
</tr>
<tr>
<td>Reactor</td>
<td><a href="http://keno.serio.jp/union/docs/reactor/api/net/user1/reactor/ClientManager.html#sendMessage%28%29">ClientManager.sendMessage();</a></td>
<td>ClientManager APIによるMessage</td>
<td>次回以降の情報</td>
<td>不可</td>
</tr>
<tr>
<td>Reactor</td>
<td><a href="http://keno.serio.jp/union/docs/reactor/api/net/user1/reactor/Client.html#sendMessage%28%29">Client.sendMessage()</a></td>
<td>Client APIによるMessage</td>
<td>次回以降の情報</td>
<td>不可</td>
</tr>
<tr>
<td>Union Server</td>
<td><a href="http://unionplatform.com/docs/union/api/net/user1/union/api/Client.html#sendMessage%28java.lang.String,%20java.lang.String...%29">Client.sendMessage()</a>, <a href="http://unionplatform.com/docs/union/api/net/user1/union/api/Room.html#sendMessage(net.user1.union.filter.Filter,%20java.lang.String,%20java.lang.String...)">Room.sendMessage();</a></td>
<td>Union ServerからのMessage</td>
<td>次回以降の情報</td>
<td>不可</td>
</tr>
</tbody>
</table>
<p>以降、今回の情報共有化とは直接関係するわけではありませんが、Module Messageについて紹介します。Union Serverにログを保存したり、外部APIにログを保存する際などに使えるので、情報の共有化と関係があると考え、今回紹介します。</p>
<h3>Module Message</h3>
<p>Module Messageでは、Union Serverに対してMessageを送信します。送信したMessageの内容をUnion Server側で以下のような処理が可能です。</p>
<ul>
<li>チャットのログをDBに保存してからUnion ServerからのMessageでRoom, Clientへ通知する</li>
<li>受け取った情報を整形(チャット内の禁止用語を伏せ字にするなど)して、Union ServerからのMessageでRoom, Clientへ通知する</li>
<li>Web APIを使ってtwitterへ投稿してからUnion ServerからのMessageでRoom, Clientへ通知する</li>
</ul>
<p>このような処理を実装するためにはUnion Server側にServer ModuleもしくはRoom Moduleを設置する必要があります。Server ModuleとRoom ModuleはJAVA言語で作成することが出来ます。</p>
<p>もちろん、Module Message側でUnion ServerのMessageを使わない事も出来ます。Message Moduleに関しては、Union ServerのServer Module, Room Moduleの作成方法を紹介する回で詳しくみて行こうと思います。</p>
<p>次回は、ReactorのRoomEventやClientEventをみながら、情報の共有化を実装する方法を紹介しようと思います。</p>
<h3>関連記事</h3>
<ol>
<li><a href="http://fla.la/archives/248" title="UnionPlatform (1) 概要">UnionPlatform (1) 概要</a></li>
<li><a href="http://fla.la/archives/287" title="UnionPlatform (2) 概念">UnionPlatform (2) 概念</a></li>
<li><a href="http://fla.la/archives/351" title="Union Platform(3) 情報の共有化">Union Platform(3) 情報の共有化</a></li>
<li><a href="http://fla.la/archives/315" title="Union Platform(4) Reactorのイベント">Union Platform(4) Reactorのイベント</a></li>
<li><a href="http://fla.la/archives/364" title="Union Platform(5) チャットを作る">Union Platform(5) チャットを作る</a></li>
<li><a href="http://fla.la/archives/347" title="Union Platform(6) Union Server入門">Union Platform(6) Union Server入門</a></li>
<li><a href="http://fla.la/archives/365" title="Union Platform(7) Union Server Module作成準備">Union Platform(7) Union Server Module作成準備</a></li>
<li><a href="http://fla.la/archives/369" title="Union Platform(8) Moduleサンプル">Union Platform(8) Moduleサンプル</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/351/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
