Flexのsamplesにあるチャット(dashboard_chat)をいじってみた。
samplesを改変して、こんな感じでシンプルに。flex.war を雛形にして作ってみました。下記のコードでは、誰が発言しても、ユーザー名はtest-userになってしまいますが(汗)
まずは chat.mxml を新規作成。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" layout="absolute" width="900" height="150" pageTitle="FlexChat" creationComplete="initApp()"> <mx:Producer id="producer" destination="dashboard_chat"/> <mx:Consumer id="consumer" destination="dashboard_chat" message="messageHandler(event)"/> <mx:VBox width="100%" height="100%"> <mx:TextArea id="messageField" width="100%" height="100%" editable="false" wordWrap="false"/> <mx:HBox width="100%"> <mx:TextInput id="inputField" width="100%" maxChars="256" enter="send()"/> <mx:Button label="Send" click="send()"/> </mx:HBox> </mx:VBox> <mx:Script> <![CDATA[ import mx.messaging.messages.*; import mx.messaging.events.*; [Bindable] private var userId:String; private function initApp():void { consumer.subscribe(); userId = "test-user"; } public function send():void { var message:AsyncMessage = new AsyncMessage(); message.body = { userId: userId, msg: inputField.text }; producer.send(message); inputField.text=""; } public function messageHandler(event:MessageEvent):void { var body:Object = event.message.body; if (messageField != null && body.userId != undefined) { var txt:String = body.userId + ": " + body.msg + "\n"; messageField.text += txt; messageField.validateNow(); messageField.verticalScrollPosition = messageField.maxVerticalScrollPosition; } } ]]> </mx:Script> </mx:Application>
そして /WEB-INF/flex/messaging-config.xml に以下を追記。
<destination id="dashboard_chat"> <properties> <network> <session-timeout>0</session-timeout> </network> <server> <max-cache-size>1000</max-cache-size> <message-time-to-live>0</message-time-to-live> <durable>false</durable> </server> </properties> <channels> <channel ref="my-rtmp"/> </channels> </destination>
さらに /WEB-INF/flex/services-config.xml 内にある、my-rtmp の URL(services-config/channels/channel-definition(id=my-rtmp)/endpoint)のポート番号を2038から2037に変更しないと、うまく動きませんでした。なぜ? (雛形flex.warは2038で、samples.warは2037になっている。)
<endpoint uri="rtmp://{server.name}:2038" class="flex.messaging.endpoints.RTMPEndpoint"/>
↓
<endpoint uri="rtmp://{server.name}:2037" class="flex.messaging.endpoints.RTMPEndpoint"/>
こんな感じで、なんとなくチャットっぽく動いた。
ところで、このチャットを改変して、以下のような事はできるんでしょうか?
- 発言中に[abc]があったら、サーバサイドのロジックを動かして、データベースのabcのレコードをとってきて、内容を置換する。(データベースで、abcのレコードがcepocになっていたら、「データabcは[abc]です」→「データabcはcepocです」と変換、等)いわゆるマクロ。
- 定時になると、サーバがチャットに発言。(2:00になると「system: 午前2時をお知らせします♪」と送信される)いわゆる時報。