“Scopes ”和“Contexts”是开发red5重要概念。
利用red5创建的任何应用常常都和“application”有关,applications 是建立在flash 客户端和red5 服务之间以任何形式交互的基础和基本概念。术语 "application" 来源于 Flash Media Server (FMS), Adobe 研发用于和 flash 客户端通信的软件。 red5 使用更复杂模式来处理flash 客户端的请求,red5 使用类似于搭积木组合方式来模拟 FMS 的application“ 概念;简而言之,如你在red 创建以一个 "application" ,那么同时创建了 一个WebScope ( scope 的一种),一个 Context ,一个 handler。
Scope
red5 作用域模型类似于树中的节点
树的根-RootScope-存在于所有的 applications 当中(所有的applications 都可以访问),RootScope 代码命名为 "default",它是 类 GlobalScope 的一个实例主要为applications提供通用的共享资源。RootScope 隐含为其他 Scope 之上的 Scope,也就说不能被任何连接的客户端直接命名。
RootScope 直接下级 scope 是一系列特别的 scopes ,每一个 scope 代表了 red5 服务器运行的一个 application, 这些scope 命名和 application 上下文命名一致,这些scope 是类 WebScope 的一个实例,因为这些 scope 命名和 application 上下文命名一致
导致很难区分它们,事实上他们是完全不同的两个东西。
WebScope 下面的节点,稍微有些不同,每一个 WebScope 被运行它的 red5服务器显示的定义; 每一个WebScope 拥有自己的配置文件,并且可以看做是独立的application。如果想创建 WebScope 作用域你需要在red5 下创建 application 目录和配置文件。在 WebScope 下创建指定的作用域,指定的作用域就会被动态的创建(如果指定作用域没有被创建)。例如,假如没有一个应用没有创建“myApp” 的作用域。某个 flash 客户端 连接到 "rtmp://red5serverHostname/myApp/aaa/bbb/ccc" red5 会检查 "aaa" 是否已经存在,如果不存在就创建"aaa" 作用域,同理 "bbb" 和 "ccc"。
每一个WebScope 之下的动态作用域命名和给定的连接路径名称一致,例如上面的例子,作用域的名称分别是 'aaa', 'bbb', 和'ccc' 。这些作用域 分别由 Scope 类 或者 BasicScope 类来实例化。没有子节点的叶子节点通常由 BasicScope 类实例化,非子节点由 Scope 类实例化。这些作用域都为flash 客户端提供功能调用,但是当flash 客户端连接到叶子域时,叶子域提供更有用的功能调用。例如,"ccc" 域可以提供在线流连接或者 "shared object" 连接,并允许多个flash客户端数据共享。
言简意赅,下面的图表展示了red5 服务器作用域的典型层次结构。flash 客户端将连接这些路径('aaa', 'foo', 和 'bar' 是跑在 red5 上的独立应用):
Key: scopeName(scopeClass)
==========================
default(GlobalScope) -> aaa(WebScope) -> bbb(Scope) -> ccc(BasicScope)
(隐含) /aaa /bbb /ccc
-> foo(WebScope) -> chatroom1(Scope) -> videocam1(BroadcastScope)
/foo /chatroom1 /videocam1
-> videocam2(BroadcastScope)
/videocam2
-> bar(WebScope) -> game1(Scope) -> level1(SharedObjectScope)
/bar /game1 /level1
-> level2(SharedObjectScope)
/level2
-> game2(Scope) -> level1(SharedObjectScope)
/game2 /level1
-> level2(SharedObjectScope)
/level2
-> level3(SharedObjectScope)
/level3
连接路径:
/aaa/bbb/ccc
/foo/chatroom1/videocam2
/bar/game2/level3
当然 BasicScope 可以被扩展并提供额外的功能。两个自定义扩展自BasicScope的类已经定义于red5; 他们分别是BroadcastScope (视频/音频 数据流等等) 和 SharedObjectScope (flash客户端文本,图像共享等等)
Context
每个application 在Red5中 仅仅只有一个 Context。 Context 类实现了接口 IContext。 context 实例对象由Java Spring framework 初始化,它提供作用路径映射和不同服务接口。每个application只有一个context 和一个WebScope,WebScope 的名称和 context 的路径配置相关,它们名称虽相同但意义不同。
Handler
现在,我们有了如何让flash 客户端怎样去连接的scope 系统,有了来映射作用域请求的context,和服务应用代码。这些代码位于 Handler。
handler 是red5 application 主要功能的实现,它实现了客户端连接和断开连接的方法,实现了客户端远程调用(RPC)的方法.
application 的初始化入口是从实例化WebScope 类开始的。当客户端连接这个application,red5 需要调用WebScope 类多个方法来初始化。因此 application's handler 需要实现 IScopeHandler 接口 ,这个接口定义red5 必须要调用的方法。
handler 由这些开发red5应用的创建,通常也需要扩展 red5 已经实现的 ApplicationAdapter 类 或者 MultiThreadedApplicationAdapter 类,这些类已经实现了基本的 handler 功能,并且实现了必须实现的IScopeHandler 接口。