migration guide form FCS/FMS to red 5 :: 从FCS/FMS迁移到red5的指南
Author: Joachim Bauch tranlater:yapollo.li email:yapollo.li@gmail.com
作者:Joachim Bauch 翻译:yapollo.li
Contents内容介绍:
- Preface序文
- Application callbacks 应用程序回调
- Interface IScopeHandler IScopeHandler(作用域事件)接口
- Class ApplicationAdapter类 ApplicationAdapter
- Accepting / rejecting clients接收和拒绝客户端
- Current connection and client当前的连接和客户端
- Additional handlers 附加事件处理
- Handlers in configuration files在配置文件中注册处理事件
- Handlers from application code在应用程序代码中注册处理事件
- Calls to client methods 调用客户端的方法
- SharedObjects 共享对象
- Serverside change listeners服务器端执行更改共享对象的事件监听处理
- Changing from application code从应用程序去更改共享对象
- SharedObject event handlers共享对象的事件处理
- Persistence持久性(持续性)
- Periodic events循环事件
- Remoting远程调用
- Remoting server远程调用服务器端
- Remoting client远程调用客户端
- Streams流媒体
序文:
这篇文档描述了 fcs/fms与red5之间的API(应用程序接口)的不同,目的在于帮助那些已经存在于FCS/FMS的应用程序迁移到RED5上,如果你还没有点red5经验,请阅读这方面的指南howto create new applications
应用程序回调
在实现服务器端应用程序的时候一个重要的功能就是通告客户端是否链接,以及当应用程序有新的实例创建的时候能够通知该消息。
Interface IScopeHandler
Red5在接口 IScopeHandler 中指定了这些动作 , 大家可以看它的api文档去进一步了解细节
Class ApplicationAdapter
ApplicationAdapter 类介绍:
因于一次请求中一些方法可能被重复的调用(比如:一旦有新客户端链接产生的时,connect方法就会被调用),所以这个类ApplicationAdapter 中定义了许多附加的方法事件
这个类通常被新的应用程序用作基础类
下面是一个一览表,它显示了FCS/FMS应用程序类和red5中ApplicationAdapter方法的对比
FCS / FMS Red5
onAppStart appStart roomStart
onAppStop appStop roomStop
appConnect roomConnect appJoin roomJoin
onDisconnect appDisconnect roomDisconnect appLeave roomLeave
你也可以使用ApplicationAdapter去核对流媒体对象,共享对象,或者预定义他们。关于进一步的细节可以参考它的api文档
以app做前缀的方法,是在主应用程序中被调用滴,以room做前缀的方法是在应用程序的房间(也就是实例中)被调用
链接方法的执行命令
假设你要链接rtmp://server/app/room1/room2
首先 ,建立连接,那么所有链接到room2的用户都能被全部显示,
- app (-> appConnect)
- room1 (-> roomConnect)
- room2 (-> roomConnect)
在连接被建立后,客户端对象能被取回,并且如果它(指取回的客户端对象)是第一个被客户端连接到这个作用域的,他就加入该作用域
- app (-> appJoin)
- room1 (-> roomJoin)
- room2 (-> roomJoin)
如果在同一作用域内一个用户建立了第二个(或者多余)链接,那么只有这些连接方法被调用,如果你连接到部分相同作用域内,那么只有部分加入方法被调用
比如:连接 rtmp://server/app/room1/room3 将会触发下面的语句
- appConnect("app")
- joinConnect("room1")
- joinConnect("room3")
- roomJoin("room3")
appStart 方法在开启red5服务的时候,当前只能被调用一次,
roomStart 方法在第一个客户端连接到房间的时候被调用
接受,拒绝客户端
FCS/FMS 提供了如acceptConnection 和rejectConnection的方法去接受和拒绝新的客户端。对Red5应用程序,允许客户端连接,没有专门的动作是必须得在这种情况下后缀为Connect的方法只是需要返回true
如果客户端不允许去连接,在ApplicationAdapter 类中的rejectClient方法将会被调用,任何被传递给rejectClient的参数都是有效滴,会被看做状态对象的应用程序的属性从而被回调函数返回
当前的连接和客户端访问
Red5支持两种不同的方法,从被调用函数中访问当前的连接对象,这个连接对象能被用于获取活跃的客户端和他被连接的作用域。第一个使用 Red5 对象
代码如下:
import org.red5.server.api.IClient;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
import org.red5.server.api.Red5;
public void whoami() {
IConnection conn = Red5.getConnectionLocal();
IClient client = conn.getClient();
IScope scope = conn.getScope();
// ...
}
第二种需要这个方法被定义一个IConnection类型的参数,同时当一个客户端调用该方法时第一个参数会被red5自动添加,代码如下:
import org.red5.server.api.IClient;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
public void whoami(IConnection conn) {
IClient client = conn.getClient();
IScope scope = conn.getScope();
// ...
}
附加事件的处理
对于许多应用程序而言,已经存在的类包含的应用程序逻辑(指那些和red5不相关的)是必须被重复使用的,为了能对那些通过RTMP连接的客户端有效,这些类需要在Red5中作为事件注册。
当前有两个方法去注册这些事件:
1. 通过配置文件去增加他们
2. 通过手工从应用程序中注册他们
这些事件被客户端调用执行的示例代码如下:
nc = new NetConnection();
nc.connect("rtmp://localhost/myapp");
nc.call("handler.method", nc, "Hello world!");
如果一个事件处理器被请求,Red5总是会在检测配置文件环境中的设置的事件处理器之前先去在客户端的作用域范围内寻找它。
Handlers in configuration files
在配置文件中处理事件
这种方法更适用于那些对所有作用域的程序都运行的常见事件
下面是一个事件处理的例子,它的作用是去注册类com.fancycode.red5.HandlerSample
下面的bean 需要加入WEB-INF/red5-web.xml的文件中。
<bean id="sample.service"
class="com.fancycode.red5.HandlerSample"
singleton="true" />
Note that the id of the bean is constructed as the name of the handler (heresample) and the keyword service.
注意这个bean的id 被构建作为处理器程序和关键字服务的名字
Handlers from application code
在应用程序中用代码注册事件处理
不同作用域的应用程序使用不同的事件处理,如果想去更改它们,就需要在服务端的代码中注册他们。写在服务端的这些事件处理总会覆盖在red5-web.xml中配置的事件。这些已经注册过的必要函数被命名在IServiceHandlerProvider中,当然IServiceHandlerProvider在ApplicationAdapter类中实现哈
如同上面描述的类文件能被用代码注册的例子如下:
public boolean appStart(IScope app) {
if (!super.appStart(scope))
return false;
Object handler = new com.fancycode.red5.HandlerSample();
app.registerServiceHandler("sample", handler);
return true;
}
注意:在这个例子中,只是这个应用程序的作用域有sample处理程序,而不是子作用域,如果想这个处理程序同样在
房间中起作用,必须在房间的作用域内的