现在的位置: 首页 > 综合 > 正文

如何创建Red5应用程序

2012年12月21日 ⁄ 综合 ⁄ 共 3859字 ⁄ 字号 评论关闭
一.序言:
========================
本文档的目的是描述如何在Red5中创建应用程序.需要使用Red5中所给的API.

二.应用程序目录:
========================
在默认的情况下,Red5将所有的应用程序存放在根目录的"Webapps"目录下面.因此在创建一个新的应用程序之前,首先需要在这个目录中创建一个子目录.习惯上这个子目录的名字应该和马上创建的应用程序的名字是一样的.

在你的新应用程序中,需要一个"WEB-INF"的文件夹用来存放关于使用类情况的配置文件.你可以使用Red5提供的一个模板,它可以在"doc/templates/myapp"文件夹中找到.

在Red5启动的时候,所有文件夹中的配置文件都会搜索到.

三.配置:
========================
这个主要的配置文件是:"Wed.xml".它包含了如下参数:

1.globalScope:
如下例子"globalScope"为参数名字,"default"为参数对应的默认值.
<context-param>
  <param-name>globalScope</param-name>
  <param-value>default</param-value>
</context-param>

2.contextConfigLocation
设置应用程序中控制文件的名称.这些控制文件列出了应用程序连接或断开客户端的类,同时也提供客户端可以调用的方法的类.

控制文件还设定了这些类的有效范围.

在这个路进中还可以使用通配符,从而可以包含进来多个文件.::
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/red5-*.xml</param-value>
  </context-param>

3.locatorFactorySelector
指定根应用程序上下文配置文件通常是"red5.xml"::
  <context-param>
    <param-name>locatorFactorySelector</param-name>
    <param-value>red5.xml</param-value>
  </context-param>

4.parentContextKey
父上下文的名字,通常是"default.context"::
  <context-param>
    <param-name>parentContextKey</param-name>
    <param-value>default.context</param-value>
  </context-param>

5.log4jConfigLocation
指定子log系统的路径.
  <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/log4j.properties</param-value>
  </context-param>

6.webAppRootKey
应用程序唯一的名称::
  <context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>/myapp</param-value>
  </context-param>

四.配置文件
每一个控制配置文件都至少包括如下三种Bean.
1.Context
这个Context bean有个预留的名字"web.context",它用来将路径放入域中,同时查找服务和控制器.默认的类是"org.red5.server.Context".

具体代码如下:
<bean id="web.context" class="org.red5.server.Context" autowire="byType" />
每个应用程序只能有一个Context.然而这个Context能够夸多个域共享.

2.域(Scope)
每一个应用程序至少有一个Scope,这个Scope将控制器(Handler)连接到了Context和Server.这个Scopes用来建造一个树结构,客户端能够连接到这个树上的任何一个节点和共享对象(例如共享对象或者实时流).你可以将Scope看作是一个房间或者实例.

默认的Scope通常有个名字"web.scope",但是这个名字可以任意的选择.

这个Bean有如下的属性.
"server"----设置全局的服务器域"red5.server".
"parent"----设置父域,通常是"global.scope".
"context"----指当前域,使用上面提到的"web.context"
"handler"----当前域的控制器(Handler,下面将会提到).
"contextPath"----连接当前域的路径.
"virtualHosts"----用逗号分割开当然域(scope)运行的一组主机名或者IP地址.

例如:
  <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="/myapp" />
    <property name="virtualHosts" value="localhost, 127.0.0.1" />
  </bean>

你可以将"contextPath"和"virtualHosts"的值转移到一个单独的properties文件,然后用参数表示.如果是这样的话,你就需要另外的一个Bean::
  <bean id="placeholderConfig"
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="/WEB-INF/red5-web.properties" />
  </bean>
假设一个"red5-web.properties"文件包含如下数据::
  webapp.contextPath=/myapp
  webapp.virtualHosts=localhost,127.0.01
那么,在Scope中的参数将会变成如下样子::
  <property name="contextPath" value="${webapp.contextPath}" />
  <property name="virtualHosts" value="${webapp.virtualHosts}" />
这个"contextPath"将会被看作域的"根(root)".当需要动态创建扩展域的时候,你可以在这个路进后边添加新的元素.

这个额外域将使用同一个控制器(Handler),但是他们都拥有自己独立的属性,共享对象和实时流.

3.控制器(Handlers)
每一个Context都需要一个控制器(Handler),它实现一个方法,这个方法将在一个客户端连接这个域(Scope)时触发.这个控制器需要实现的接口是:"org.red5.server.api.IScopeHandler",然而如果你想控制访问共享对象或者流,你也可以实现其它接口.

有一个"org.red5.server.adapter.ApplicationAdapter"作为一个基础类可以在类库中找到,这个类就是一个简单实现的例子.更多详细信息请查阅javadoc文档.

这个Bean作为一个域的控制器要进行如下配置::
  <bean id="web.handler" class="the.path.to.my.Application" singleton="true" />
这个ID的参数就是上面提到的域(scope)设置.

五.简单控制器
用下面几行代码实现一个简单的控制器::
  package the.path.to.my;
  import org.red5.server.adapter.ApplicationAdapter;
  public class Application extends ApplicationAdapter{
  public Double add(Double a,Double b){
  return a+b;
  }
  }
 
假设已经经过了上面的配置,你可以通过如下的脚本来调用这个方法.
  nc = new NetConnection();
  nc.connect("rtmp://localhost/myapp");
  nc.onResult = function(obj){
  trace("This result is " +obj);
  }
  nc.call("add",nc,1,2);
输出的结果如下:
The result is 3;

抱歉!评论已关闭.