Red5 將所有定義應用程序的配置文件固定放置在根目錄下(在 linux 下,這個根目錄通常指的是 dist )的 webapps 目錄內,因此,在建立一個新的應用程序前,你必須先在 webapps 目錄下新建一個子資料夾,名稱通常就是你的 project 名稱,然後在它之下再建立一個子資料夾,你必須將這個資料夾命名為 "WEB-INF",然後將配置文件及需要用到的類別 ( Class )放進這個資料夾內,配置文件並不用重頭開始建立,在 /doc/templates/myapp 目錄下有提供一個 "WEB-INF" 範本,直接拷貝過來即可。
打開這個目錄看一下,共有四個檔案:
- log4j.properties
- red5-web.properties
- red5-web.xml
- web.xml
log4j.properties
# logging config, this should be auto reloaded by spring.red5-web.properties
webapp.contextPath=/myapp webapp.virtualHosts=localhost, 127.0.0.1這個檔是將 red5-web.xml 中的 contextPath 和 virtualHosts 屬性另外移出建立的檔案。
裡面的 "contextPath" 會被視為作用域的根 ( root ),當你需要動態建立擴充作用域時,就可以在這個路徑後增加新的元素,這個擴充作用域將和原來的作用域共用一個控制器,但是擁有自己獨立的屬性、shared objects 和 live streams
red5-web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<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.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="the.path.to.my.Application" singleton="true" />
<!-- this will support calling methods through "myhandler.<methodName>" -->
<bean id="myhandler.service" class="the.path.to.my.ServiceHandler" singleton="true" />
</beans>
每一個配置檔都至少包括以下三種 Bean:1.Context
這個 bean 的預留名稱為 "web.context" 它的作用是將路徑映射到作用域中,查詢服務和控制器,預設的類別為 "org.red5.server.Context",在每一個應用程序只能有一個 Context,但是這個 Context 可以分享至多個作用域。
2.Scopes
每一個應用程序至少有一個可以將控制器連接到 Context 和 Server 的作用域,它的作用是用來建造一個樹狀結構,客戶端能夠連接到這個樹狀結構上的任何一個結點及分享物件 ( 例如 shared objects 或是 live streams ),你可以將作用域看成是一間房間或是一個實例。
作用域的預設名稱為 "web.scope",你可以隨意的更改,它擁有以下屬性:
- server
設置全體的伺服器作用域為 "red5.server" - parent
設置父作用域,通常為 "global.scope" - context指目前作用域,使用 "web.context"
- handler
目前作用域的控制器 - contextPath
連接目前作用域的路徑 - virtualHosts
以逗號分開執行中的作用域的主機名稱或 IP 地址
3.Handlers
每一個 context 都需要一個控制器,它實現一個當客戶端連接一個作用域時觸發的方法,這個控制器的界面是 "org.red5.server.api.IScopeHandler",當然,你也可以實現其它的界面去控制存取 shared objects 或 streams
一個最簡單的實現例子,就是可以在類別庫中找到的基礎類別"org.red5.server.adapter.ApplicationAdapter",詳情可以參考 javadoc 文件
如果你不需要使用任何伺服端技術(asp.net、php、J2EE...)的話,你可以使用 Red5 提供的預設應用程序控制器:
<bean id="web.handler" class="org.red5.server.adapter.ApplicationAdapter" singleton="true" />
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>My sample Red5 application</display-name>
<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>
#這個區塊把它刪除掉
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>/myapp</param-value>
</context-param>
#這個區塊把它刪除掉
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- remove the following servlet tags if you want to disable remoting for this application -->
<servlet>
<servlet-name>gateway</servlet-name>
<servlet-class>org.red5.server.net.servlet.AMFGatewayServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>gateway</servlet-name>
<url-pattern>/gateway</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>
web.xml 是最主要的配置檔,它包括以下參數:
- globalScope
全作用域名稱,保持預設值即可 - contextConfigLocation
定義這個應用程序使用的配置檔的檔名,這些配置檔列出應用程序連接 / 掛斷客戶端的類別 ( class ),同時也提供客戶端可以調用方法的類別 - locatorFactorySelector
指定應用程序上下文配置文件的檔名,通常是使用 "red5.xml" - parentContextKey
父上下文的名字,通常是 "default.context" - log4jConfigLocation
指定 log 子系統的路徑 - webAppRootKey
指定此應用程序的識別名稱
一個簡單的範例,用幾行程式來建立一個控制器
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;
}
}
用 Eclipse 或其它編譯器編譯之後,在 WEB-INF 目錄下建立一個目錄,名稱為 classes,將編譯過的輸出類別放進這個目錄即可。
經過以上的配置後,你就可以使用 ActionScript 來呼叫這個方法:
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
沒有留言:
張貼留言