8/30頃にやったこと。(Red5のプログラミング) | sy-engのブログ

sy-engのブログ

システムを作りたい。
自分用の記録。

ここを参考にRed5のプログラミングをやってみる。

上記のページの5くらいから開始。
そのページに書いているようにJarファイルの構成が変わっているので、ひとまず全部、
外部JARファイルに追加する。しかし、エラーが出るので、いくつか削除した。
(現時点では特にエラーが出てない。)
最終的にWEB-INFファイルをコピーすることになるので、そのページに書いてある
ディレクトリ構成にするのが良い。

上記のページの6にあるようにeclipseで以下のプログラムを入力。
この時、プロジェクト名はtestRed5としている。
package testRed5;

import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.scope.IScope;

public class sample01 extends ApplicationAdapter {

public boolean appStart(IScope scope)
  {
    System.out.println("appStart!!!!!!!!!!!!!!!!!!!!!!!!");
    
    return super.appStart(scope);
  }
public String printHello(String name){
return "Success : " + name + " " + getClients().size();
}
}

7にあるように、設定ファイルを書き換える。コピー先は参考ページの通り。
olfaDemosのファイルをコピーしてくる。
書き換えた結果は以下のよう。
re5-web.properties
webapp.contextPath=/testRed5
webapp.virtualHosts=*, localhost, localhost:8088, 127.0.0.1:8088

red5-web.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:lang="http://www.springframework.org/schema/lang"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd                            
    http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.0.xsd">

<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
   <property name="location" value="/WEB-INF/red5-web.properties" />
</bean>

<bean id="web.context" class="org.red5.server.Context" autowire="byType" />

<bean id="web.scope" class="org.red5.server.scope.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="${webapp.contextPath}" />
<property name="virtualHosts" value="${webapp.virtualHosts}" />
</bean>

<bean id="web.handler" class="testRed5.sample01" />
<!--
<bean id="web.handler" class="org.red5.server.script.rhino.RhinoScriptFactory">
<constructor-arg index="0" value="classpath:main.js"/>
<constructor-arg index="1">
<list>
      <value>org.red5.server.api.IScopeHandler</value>
      <value>org.red5.server.adapter.IApplication</value>
  </list>
</constructor-arg>
<constructor-arg index="2">
    <value>org.red5.server.adapter.ApplicationAdapter</value>
</constructor-arg>
</bean>

<bean id="web.handler" class="org.springframework.scripting.jruby.JRubyScriptFactory">
<constructor-arg index="0" value="classpath:main.rb"/>
<constructor-arg index="1">
<list>
<value>org.red5.server.api.IScopeHandler</value>
<value>org.red5.server.adapter.IApplication</value>
</list>
</constructor-arg>
</bean>

<bean id="web.handler" class="org.red5.server.script.groovy.GroovyScriptFactory">
<constructor-arg index="0" value="classpath:main.groovy"/>
<constructor-arg index="1">
<list>
<value>org.red5.server.api.IScopeHandler</value>
<value>org.red5.server.adapter.IApplication</value>
</list>
</constructor-arg>
</bean>

<bean id="web.handler" class="org.red5.server.script.jython.JythonScriptFactory">
<constructor-arg index="0" value="classpath:main.py"/>
<constructor-arg index="1">
<list>
      <value>org.red5.server.api.IScopeHandler</value>
      <value>org.red5.server.adapter.IApplication</value>
  </list>
</constructor-arg>
        <constructor-arg index="2">
            <list>
                <value>One</value>
                <value>2</value>
                <value>III</value>
            </list>
        </constructor-arg>
</bean>
-->
<!--
    <bean id="demoService.service" class="org.red5.demos.oflaDemo.DemoService" />
-->
<!--
<bean id="demoService.service" class="org.red5.server.script.rhino.RhinoScriptFactory">
<constructor-arg index="0" value="classpath:demoservice.js"/>
<constructor-arg index="1">
<list>
      <value>org.red5.demos.oflaDemo.IDemoService</value>
  </list>
</constructor-arg>
<constructor-arg index="2">
    <value>org.red5.demos.oflaDemo.DemoServiceImpl</value>
</constructor-arg>
</bean>

<bean id="demoService.service" class="org.springframework.scripting.jruby.JRubyScriptFactory">
<constructor-arg index="0" value="classpath:demoservice.rb"/>
<constructor-arg index="1">
<list>
      <value>org.red5.demos.oflaDemo.IDemoService</value>
  </list>
</constructor-arg>
</bean>

<bean id="demoService.service" class="org.red5.server.script.jython.JythonScriptFactory">
<constructor-arg index="0" value="classpath:demoservice.py"/>
<constructor-arg index="1">
<list>
<value>org.red5.demos.oflaDemo.IDemoService</value>
</list>
</constructor-arg>
<constructor-arg index="2" ref="web.handler"/>
</bean>
-->

<!-- Uncomment this if you are using scripting

<bean class="org.springframework.scripting.support.ScriptFactoryPostProcessor"/>
-->

</beans>

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"> 
 
    <display-name>testRed5</display-name>
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>/testRed5</param-value>
</context-param>
 
    <listener>
        <listener-class>org.red5.logging.ContextLoggingListener</listener-class>
    </listener>
    
    <filter>
        <filter-name>LoggerContextFilter</filter-name>
        <filter-class>org.red5.logging.LoggerContextFilter</filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>LoggerContextFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <servlet>
<servlet-name>rtmpt</servlet-name>
<servlet-class>org.red5.server.net.rtmpt.RTMPTServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<!--
    <servlet>
    <display-name>SecurityTest</display-name>
    <servlet-name>SecurityTest</servlet-name>
    <servlet-class>org.red5.demos.oflaDemo.SecurityTest</servlet-class>
    </servlet>
-->

<servlet-mapping>
<servlet-name>rtmpt</servlet-name>
<url-pattern>/fcs/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>rtmpt</servlet-name>
<url-pattern>/open/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>rtmpt</servlet-name>
<url-pattern>/close/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>rtmpt</servlet-name>
<url-pattern>/send/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>rtmpt</servlet-name>
<url-pattern>/idle/*</url-pattern>
</servlet-mapping>
<!--
<servlet-mapping>
<servlet-name>SecurityTest</servlet-name>
<url-pattern>/securitytest</url-pattern>
</servlet-mapping>
-->

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Forbidden</web-resource-name>
            <url-pattern>/streams/*</url-pattern>
        </web-resource-collection>
        <auth-constraint/>
    </security-constraint>

</web-app>

8のように、データをコピーし、再起動する。
cd (red5のインストール先)/red5/webapps
sudo cp -r ~/workspace/testRed5 .
cd ..
./red5-sutdown.sh
sudo ./red5.sh &

この段階でコマンドラインにJavaで書いたappStart!!!!!!!!!!!!!!!!!!!!!!!!が表示される。
デバッグの時は./red5.sh &として、ログを表示させたほうが良いように思う。

9について、action scriptをかく。
以下の内容をtest2.asに保存する。
package
{
   import flash.display.Sprite;
   import flash.events.NetStatusEvent;
   import flash.geom.Matrix3D;
   import flash.net.NetConnection;
   import flash.net.Responder;
   import flash.text.*;    

   public class test2 extends Sprite
   {
      private var nc:NetConnection;
      private var textField:TextField;
       
      public function test2()
      {
         // 接続
textField = new TextField();
addChild(textField);
textField.text = "Start\n";

         nc=new NetConnection();
         nc.addEventListener(NetStatusEvent.NET_STATUS, onStatus);
         nc.connect("rtmp://localhost/testRed5");

textField.appendText("End of init\n");
      }
       
      private function onStatus(evt:NetStatusEvent):void
      {
         // 接続結果の確認
         switch(evt.info.code)
         {
            // 成功している場合は続行
            case "NetConnection.Connect.Success":
               var listener:Function=function(str:String):void{textField.appendText(str);}
    textField.appendText("OK?\n");
               nc.call("printHello", new Responder(listener), "sakef");
    textField.appendText("OK?\n");
               break;
             
            // 他はエラーを表示
            case "NetConnection.Connect.Closed":
               textField.appendText("Closed");
               break;
            case "NetConnection.Connect.Failed":
               textField.appendText("Failed");
               break;
            case "NetConnection.Connect.Rejected":
               textField.appendText("Rejected");
               break;
   case "NetConnection.Connect.AppShutdown":
               textField.appendText("SD\n");
               break;
   case "NetConnection.Connect.InvalidApp":
               textField.appendText("IA\n");
               break;
   case "NetConnection.Connect.IdleTimeout":
               textField.appendText("IT\n");
               break;
   case "NetConnection.Connect.NetworkChange":
               textField.appendText("NC\n");
               break;
            default:
               textField.appendText("Error!!!!" + nc.connected);
         }
      }

   }
}

これをコンパイルして、実行する。
mxmlc test2.as
flashplayerdebugger test2.swf