RED5
將所有的應用程序都放在RED5根目錄下的"webapps"目錄。你需要為所創建的程序在webapps目錄下添加相應的目錄。在你的應用程序目錄里應該有一個名為"WEB-INF"的目錄,用來存放你的程序的配置文件。在"doc/templates/myapp"目錄有一個模板,可以用來幫你完成建立程序的初始工作。
RED5啟動的時候,在"webapps"目錄的程序文件都是搜索"WEB-INF"的目錄下的配置文件來完成配置的。
最主要的配置文件是"web.xml"。這個文件里包含了以下參數:
globalScope:指定全局作用范圍
<context-param>
? ? <param-name>globalScope</param-name>
? ? <param-value>default</param-value>
</context-param>
contextConfigLocation:指定配置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:日志配置文件的位置
<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配置文件最少需要有三個bean
Context:用來影射路徑到某個作用范圍、搜索服務和Handler,它有一個保留的名字"web.context"。 其默認的類為org.red5.server.Context
<bean id="web.context" class="org.red5.server.Context"
? ???autowire="byType" />
對于沒有一個應用程序只應該有一個Context,但是同一個Context可以被多個作用范圍共享
Scope:每一個應用程序最少有一個作用范圍,用來將handler連接到context和服務器。作用范圍可以建立一棵樹,每一個客戶端連接到樹上的一個節點,而共享對象存在于作用范圍里。可以把作用范圍看作是聊天室或者程序實例。默認的作用范圍通常是web.scope,不過這名字是可以任意取的。
對于bean有以下屬性:
server:與全局服務器"red5.server"相關。
parent:指定當前作用范圍的父范圍,通常是"global.scope"
context:當前作用范圍的服務器上下文,一般指定為"web.context"
handler:對應當前作用范圍的handler
contextPath:用來連接到當前作用范圍的路徑
virtualHosts:一個主機名或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
則上邊的bean的"contextPath"和"virtualHosts"屬性即可使用變量來指定值
??<property name="contextPath" value="http://www.ruyiblog.com/${webapp.contextPath}" />
? ?<property name="virtualHosts" value="http://www.ruyiblog.com/${webapp.virtualHosts}" />
對于"contextPath"可以視為是一個根作用范圍。你可以在配置好的"contextPath"路徑后邊隨意添加其他的路徑,而連接到這些路徑的客戶端將動態創建另外的作用范圍,這些作用范圍使用的是同樣的handler,但擁有自己的屬性、共享對象和活動流。
handler:每一個上下文需要一個handler來響應用戶連接、離開作用范圍時的動作,handler實現了很多方法,用戶可以調用以達到特定的目的。這個handler必須實現"org.red5.server.api.IScopeHandler"接口,當然針對共享對象和流的訪問還應該實現其他的接口。
在"org.red5.server.adapter.ApplicationAdapter"可以找到一個能夠用作基類的例子,同時還應該多多參照文檔以得到更多細節。
某個作用范圍的handler可以如下指定:
<bean id="web.handler"
? ???class="the.path.to.my.Application"
? ???singleton="true" />
其中"id"屬性是上邊定義的作用范圍里指定的。
如果你不需要任何服務端的邏輯處理,可以使用Red5默認提供的handler
<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;
? ? }
??}
這里假設使用上邊的配置,則在客戶端調用的時候使用以下方式
??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