最初のアプリ

Red5のサーバ側のアプリケーションを初めて作成してみました。と同時にクライアントのアプリは flex4(swf) で作成。いわゆる"HelloWorld"です。

次のように動作します。

  1. FlashPlayerで起動されたクライアントアプリが
  2. Red5のサーバアプリと接続を行い、
  3. サーバアプリの sayHello関数を呼び出し、
  4. その関数の戻り値(文字列)を受け取り、
  5. ダイアログでそのメッセージをポップアップする、

本来欲しいのは、ビデオオンデマンド(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 になっています・・・うーん、やっとデモサンプルが読めるようになってきた。ブログでまとめるという有益さがこれかもなぁ。ひとりでコツコツというよりも、少しは深く理解しようと努めるから理解が進み易いのかなぁ。

格納するファイルは、

  • サーバアプリ側
    • GettingStartedApp.jar <= GettingStartedApp.class <= GettingStartedApp.javaコンパイルとjar化による)
    • web.xml (テンプレートを参考に作成)
    • red5-web.xml (テンプレートを参考に作成)
  • クライアントアプリ側
    • GettingStartedClient.swf <= GettingStartedClient.mxml と GettingStartedClient.as (コンパイルによる)

開発に使用した言語は、次の二つです。

ほかに、必須ではないですが、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.xmlRTMPには 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」がクライアントから見えるアプリケーション名となります。

クライアント側

MXMLActionScript という僕にとって一番使いやすい構成にしました。

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 で起動させます。