最初のアプリ
Red5のサーバ側のアプリケーションを初めて作成してみました。と同時にクライアントのアプリは flex4(swf) で作成。いわゆる"HelloWorld"です。
次のように動作します。
- FlashPlayerで起動されたクライアントアプリが
- Red5のサーバアプリと接続を行い、
- サーバアプリの sayHello関数を呼び出し、
- その関数の戻り値(文字列)を受け取り、
- ダイアログでそのメッセージをポップアップする、
本来欲しいのは、ビデオオンデマンド(VOD)やライブストリーミングなのですが、現段階では作成・構成方法不明。次の段階でチャレンジです。現状では取り敢えず "HelloWorld"を作成してみました。
両サイトのサンプルを参考に、自分にとって見通しが付くレベルまでダイエットしました。クライアントアプリの開発環境は、flex sdk に変更しました。また、Red5 内の doc/template にサーバアプリ用の雛型ファイルがあるので、これも参考にしました。
Red5 アプリのフォルダ構成
Red5 がインストールしてあるフォルダ(「c:/Program Files/Red5」)内に「webapps」というフォルダがあります(無ければ作る)。そして、次の図のような構成を作成しファイルを格納します。webapps/Sampleフォルダを解凍して、c:/Program Files/Red5/webapps/などに格納します。
巷間のサンプルでは、アプリケーション名と同じ名前のフォルダを作成していますが「Sample」という別の名前を付けたフォルダでも、問題なく動いています。動けばいい程度の考えなので、これ以上追求しないかも・・・だけど、わざわざ名前を変える必要性も無いと思います。そもそも、中身とフォルダ名が異なると自分で管理できなくなりそうなので、無益どころか有害だと思います。あくまで、ヘェーと言う興味本位に留めるつもりです。Red5のデモ oflaDemo の場合は、フォルダ名が oflaDemo ですが、javaのクラス名は Application になっています・・・うーん、やっとデモサンプルが読めるようになってきた。ブログでまとめるという有益さがこれかもなぁ。ひとりでコツコツというよりも、少しは深く理解しようと努めるから理解が進み易いのかなぁ。
格納するファイルは、
- サーバアプリ側
- クライアントアプリ側
開発に使用した言語は、次の二つです。
ほかに、必須ではないですが、ant(apache-ant-1.7.1) をjavaのコンパイル・jar化に使っています。
ソース一式はコンパイルした環境を圧縮したものです。
サーバ側
関連ファイルに変更があった場合、Red5を再起動する必要があります。Windowsサービスよりも、red5.bat をお勧めします。
GettingStartedApp.java
サーバ・アプリケーションになります。
package org.eggtoothcroc; import org.red5.server.adapter.ApplicationAdapter; public class GettingStartedApp extends ApplicationAdapter { public String sayHello( Object[] params ){ return "Hi! from GettingStartedApp to " + params[0].toString(); } }
コンパイルに先立ち、「classes」、「lib」というフォルダを予め作成しておかないと、エラーになるので注意します。次のように antでコンパイルします(フォルダ内の build.xml を自動的に使用することになっています)。
$ ant jar
build.xml は次のようになります。
<project name="My Sample Red5 Project" default="compile" basedir="."> <target name="compile"> <javac srcdir="src" destdir="./classes" source="1.5" classpath="c:\Program Files\Red5\red5.jar"/> </target> <target name = "jar" depends ="compile"> <jar destfile="./lib/GettingStartedApp.jar" basedir="./classes"/> </target> </project>
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <context-param> <param-name>globalScope</param-name> <param-value>default</param-value> </context-param> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/red5-*.xml</param-value> </context-param> <context-param> <param-name>locatorFactorySelector</param-name> <param-value>red5.xml</param-value> </context-param> <context-param> <param-name>parentContextKey</param-name> <param-value>default.context</param-value> </context-param> </web-app>
巷間のサンプルでは、次のような記述が更に必要らしいですが、なくても問題が起きていません。現段階では調べていませんので不明です。動けばよいという程度の考えなので、これ以上追求しないかも・・・<display-name>Getting Started Application on Red5</display-name> ・・・・・・・・・・・・ <context-param> <param-name>webAppRootKey</param-name> <param-value>/GettingStartedApp</param-value> </context-param>
上記のような web.xml には、サンプルアプリ固有の記述が含まれていないので、次のように空っぽでも良いということになるのではと?と想像しましたので、下記 web.xml で試してみました・・・<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> </web-app>実際、このweb.xmlでもサンプルアプリは動作しました。もっと言えば、web.xml を削除しても動作しました。どういう事かは、未だ調べていません。だけど、これ以上ダイエットしても、酔狂の部類になりそうなので止めておきます。
判った。今(2009/10/25)判りましたので、追記します。後にロギングの設定に web.xml が使われることが判明するのですが、更に今、思いついたのは、Red5 はHTTP:5080 と RTMP の両機能を有しているので、HTTPには web.xml、RTMPには red5-web.xml がそれぞれの設定ファイルになってるということです。きっと、そうに違いない・・・。どこに書かれてるかは未調査。「ヒトは見たいものしか見えない」そうですが、少しも理解してないときは、そのような記述を目にしても、全然入ってこないものです。少なくとも僕はそういう人間だと証明したようなもので・・・お恥ずかしい・・・うーん・・・どうも、ここに書いてありそうです。
red5-web.xml
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="web.context" class="org.red5.server.Context" autowire="byType" /> <bean id="web.scope" class="org.red5.server.WebScope" init-method="register"> <property name="server" ref="red5.server" /> <property name="parent" ref="global.scope" /> <property name="context" ref="web.context" /> <property name="handler" ref="web.handler" /> <property name="contextPath" value="/MYSAMPLE" /> <property name="virtualHosts" value="localhost, 127.0.0.1" /> </bean> <bean id="web.handler" class="org.eggtoothcroc.GettingStartedApp" singleton="true" /> </beans>
contextPathの「MYSAMPLE」がクライアントから見えるアプリケーション名となります。
クライアント側
MXML+ActionScript という僕にとって一番使いやすい構成にしました。
GettingStartedClient.xml
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="onApplicationComplete(event);"> <mx:Script source="GettingStartedClient.as"/> </mx:Application>
ActionScriptのファイルを取り込むだけです。Gumbo(flex4) の場合は次のようになります。
- Gumbo(flex4) 用の GettingStartedClient.mxml
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/halo" applicationComplete="onApplicationComplete(event);"> <fx:Script source="GettingStartedClient.as"/> <s:Application>
GettingStartedClient.as
import mx.controls.Alert; import flash.net.NetConnection; import flash.events.NetStatusEvent; private var nc:NetConnection = new NetConnection(); private function onApplicationComplete( event:Event ) : void { nc.addEventListener( NetStatusEvent.NET_STATUS, onStatus ); nc.connect("rtmp://localhost/MYSAMPLE"); } private function onStatus( event:NetStatusEvent ) :void { switch(event.info.code) { case "NetConnection.Connect.Success": Alert.show("Got connected with application"); callServer(); break; default: Alert.show(event.info.application); break; } } private function callServer() : void { var responder:Responder =new Responder( onResult ); nc.call( "sayHello", responder, "GettingStartedClient (お初クライアント)" ); } private function onResult( result:Object ) : void { Alert.show("result is ..."+result); }
NetConnectionで指定しているMYSAMPLEがアプリケーション名となります。red5-web.xml の contextPath に対応しています。
コンパイルは、次のようにします。
$ mxmlc.exe GettingStartedClient.mxml
コンパイルしたフォルダ中に「GettingStartedClient.swf」が作成されるので、FlashPlayer で起動させます。