应用文件夹
red5的应用都在“webapps”文件夹中,每个应用为一个文件夹。要创建应用,首先在“webapps”文件夹中新建一个文件夹,按照惯例文件夹名称就是应用的名称。
在新应用文件夹中新建一个“WEB-INF”文件夹,用来放置配置文件和类文件。你可以用Red5中"doc/templates/myapp"目录下的模板。
red5中“webapps”下的所有文件夹中都会有一个“WEB-INF”文件夹来放置配置文件。
配置
主配置文件为“web.xml”,参数如下:
GlobalScope
globalScope参数值为default
<context-param> <param-name>globalScope</param-name> <param-value>default</param-value> </context-param>
contextConfigLocation
该参数指定了应用中的控制器(handler)配置文件。控制器(handler)配置文件指定了相关类,这个类用来通知应用程序客户端是连接或断开,同时提供客户端调用的方法。
另外,配置文件也指定了类的域结构。
指定配置文件可以使用通配符来指定多个文件:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/red5-*.xml</param-value> </context-param>
locatorFactorySelector
指定根应用程序上下文配置文件通常是"red5.xml":
<context-param> <param-name>locatorFactorySelector</param-name> <param-value>red5.xml</param-value> </context-param>
parentContextKey
父上下文名称,一般是“default.context”:
<context-param> <param-name>parentContextKey</param-name> <param-value>default.context</param-value> </context-param>
log4jConfigLocation
指定logging文件
<context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/log4j.properties</param-value> </context-param>
webAppRootKey
应用的唯一名称,是一个公开的名称
<context-param> <param-name>webAppRootKey</param-name> <param-value>/myapp</param-value> </context-param>
控制器配置(Handler configuration)
该配置文件必须至少包含三个beans:
上下文(Context)
context bean名称有个保留名web.context,用来映射路径到域,同时用来查找服务和控制器(handler)。默认的类为org.red5.server.Context
默认指定方式为:
<bean id="web.context" class="org.red5.server.Context" autowire="byType" />
每个应用程序只有唯一的上下文(context)。然而这个上下文(context)能跨多个域共享。
域(Scopes)
每个应用程序至少需要一个域(scope),用来将控制器(handler)关联到上下文(context)和服务器(server)。域用来建立一个树,这样客户端能够链接到每个节点和在域中共享对象(比如共享对象或直播流)。你可以将域成房间或实例。
默认的域(scope)通常名称为 web.scope,但是这个名字可以任意的选择。
这个bean有以下的属性:
server:设置全局服务器域red5.server
parent:设置父级域通常是global.scope.
context:设置服务上下文的域,即当前域, 用上面提到的web.context
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的值放在独立的文件中。这样你需要另外一个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.0.1
域的属性值可以这样设置:
<property name="contextPath" value="${webapp.contextPath}" /> <property name="virtualHosts" value="${webapp.virtualHosts}" />
控制器(Handlers)
每个上下文(context)需要一个控制器,控制器实现一个方法当客户端链接或断开到域的时候调用,同时可以增加客户端调用的方法。控制器需要实现org.red5.server.api.IScopeHandler接口,当然你也可以再实现另外的类来控制访问共享对象(shareobject)或流数据(streams).
基础类中org.red5.server.adapter.ApplicationAdapter实现了该接口,你可以通过查看api文档了解该类详情。
域控制器配置如下:
<bean id="web.handler" class="the.path.to.my.Application" singleton="true" />
id参数值就是上面提到的设置。
如果你不需要在服务端实现任何逻辑,就可以使用red5提供的默认控制器:
<bean id="web.handler" class="org.red5.server.adapter.ApplicationAdapter" singleton="true" />
简单例子
下面的控制器(handler)例子用了很少的代码实现:
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; } }
假设控制器就如上面的,你能用下面的actionscipt调用:
nc = new NetConnection(); nc.connect("rtmp://localhost/myapp"); nc.onResult = function(obj) { trace("The result is " + obj); } nc.call("add", nc, 1, 2);
得到的结果为:
The result is 3