`
kaka-pan
  • 浏览: 26309 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

(转)red5 sharedobject详解

阅读更多

ShareObject 主要用途


SharedObjects (SOs) 主要用于多客户端的实时数据同步和方法统一调用。SharedObject 是一个远程的对象能够被多个客户端共享,也就说这些客户端在同一个域(scope)里面。


什么是 scope?

你可以把scope 当作一个聊天室,这个聊天室是通过URI 链接到服务器

例如:rtmp://localhost/red5test/lobby

"red5test" 是application 域(scope)

"lobby" 是聊天室作用域,也即 "red5test" 子域



客户端代码的编写


客户端可以用下面的代码获得 SharedObject 连接:


   // at first you need to establish a connection to the server of coursenc =newNetConnection();
nc.connect("rtmp://localhost/red5test/",true);
// when the NetConnection is successfully established// (you have to listen to NetStatusEvent.NET_STATUS event)// you can connect to a remote SharedObject e.g. named "chat"
so = SharedObject.getRemote("chat", nc.uri,false);
// when the connection to the SO is successfully established,// you can begin to specify its contents
so.setProperty("message","hello to all"); 


red5 处理 ShareObject 过程

当客户端程序连接到SharedObject,red5就会查找指定作用域SharedObject是否存在(例如上面程序“chat”).如果存在,red5就会重用它;如果不存在,red5 就会在该作用域下创建新的SharedObject提供客户端使用。

当最后一个客户端从该作用域断开连接,SharedObject就会被销毁(at least for non-persistent ones)。


服务端 ShareObject 处理过程

a)服务端获取 SharedObject

也可以从服务获取 SharedObject ,例如,服务端可以对SharedObject 做改动,让后把这些改动以广播的方式传递给客户端

在你的 java程序中你可以用如下的代码检查SharedObject 的存在

    //get scope of the current connection first
IScope scope = Red5.getConnectionLocal().getScope();
// get SO
ISharedObject so = getSharedObject(scope,"chat");
//get scope of the current connection first
IScope scope = Red5.getConnectionLocal().getScope();
// get SO
ISharedObject so = getSharedObject(scope, "chat"); 


b)服务端创建 SharedObject

当room 创建后,就可以创建新的 SharedObject 了,方法是覆写 ApplicationAdapter roomStart 的 roomStart 方法,代码如下:

  publicclassSampleApplicationextendsApplicationAdapter {
publicbooleanroomStart(IScope room) {
        if(!super.roomStart(room))            returnfalse;       createSharedObject(room,"sampleSO",true);
       ISharedObject so = getSharedObject(room,"sampleSO");
      // Now you could do something with the shared object...
      returntrue;
    }
}


如果需要创建 application 作用域 SharedObject ,那么你需要在appStart 方法中做如同上面代码所做工作


自己创建 ShareObject 问题

其中一个有利因素是你可在SharedObject 增加一个监听,当客户连接到SharedObject 时,你可以更新数据或者断开连接等等。

客户端 还是 服务端 初始化SharedObject

在java 服务端创建 SharedObject会有意料不到的问题(至少对我来说有),这些问题大部分与客户端,服务端初始化 SharedObject有关。

当然所有的 SharedObject都是在red5server 上创建的,但是不同之处是在哪儿初始化。


a)服务端初始化 SharedObject ,SharedObject 是同过java 服务端 调用createSharedObject 创建的,创建后就等待客户端的连接


b)客户端是初始化SharedObject 是客户端连接到服务端时候,服务端发现不存在SharedObject 然后自动创建的。

问题会出现在你自定义服务端代码来创建SharedObject

例如我想创建 application 作用域名叫 "chat " 的SharedObject ,并且添加一个监听,所以我在appStart 加入如下的代码:

 createSharedObject(scope,"chat",false);
ISharedObject so = getSharedObject(scope,"chat");
ISharedObjectListener listener =newMyCustomListener();
so.addSharedObjectListener(listener);
 


appStart 方法在服务器启动时只被调用一次,启动后服务端创建名叫chat 的 SharedObject 对象 。客户端可以用application 作用域连接到 chat 对象,至此所有的工作都很正常。

但是当所有的客户端断开chat 的连接后,由服务端创建的chat 会被red5服务器销毁,之后当客户端再次连接chat 对象,red5 将找不到 chat 对象并自动创建一个 chat 。新的chat对象 是由客户端初始化创建的,这自动的创建方式,没有加入监听,所以自定义事件将不会得到响应。

这样的问题不会出现的room 作用域中,假设把上面的代码放到roomStart方法中。当最后一个客户端断开连接后 room 也会被销毁,roomStart方法在 application 生命周期中将多次被调用,例如:当第一客户端连接一个room .这种情况下问题会出现在最后的客户端断开的不是它连接的room.



自己创建 ShareObject 问题解决办法

如果有些类似如SharedObjectCreationHandler 或者 SharedObjectFactory 方法就好了,不幸的是没有。

但是 ISharedObjectSecurity 提供了此类的解决方案

ISharedObjectSecurity 可以在 Application 中被registerSharedObjectSecurity注册,它被用来控制SharedObject的访问,它有一个名叫isCreationAllowed事件方法,该方法在自动创建ObjectSecurity 前判断能否被调用方法创建。

代码如下:

   
importorg.red5.server.api.ScopeUtils.getScopeService;
publicclassMySecurityHandlerimplementsI SharedObjectSecurity{
...
publicbooleanisCreationAllowed(IScope scope, String name,booleanpersistent){
    if("chat".equals(name) ){
// get the SO creation service. Basically the following lines are exactly// what MultiThreadedApplicationAdapter does. You can also pass a reference// to your Application to this SecurityHandler and use it instead
        ISharedObjectService service = (ISharedObjectService) getScopeService(scope,ISharedObjectService.class,SharedObjectService.class,false);
        if( service.createSharedObject(scope, name, persistent) ==true){
            ISharedObject so = service.getSharedObject(scope, name);
            ISharedObjectListener listener =newMyCustomListener();
            so.addSharedObjectListener(listener);
       }
   }
   returntrue;
}
...
} 


分享到:
评论
1 楼 lrztiancai 2011-07-30  

相关推荐

    flash red5开发

    【Red5 开发详解】 Red5 是一款基于 Java 开发的开源流媒体服务器,与 Adobe 的 Flash Media Server (FMS) 类似,提供多种功能,包括流媒体传输、录制、共享对象、远程调用等。它支持RTSP协议,允许在下载过程中...

    flex java red5完全学习手册

    ### Flex Java Red5 完全学习手册核心知识点详解 #### 一、Red5介绍与安装 **Red5介绍** Red5是一款基于Java开发的开源免费的Flash流媒体服务器,其功能与Adobe Flash Media Server (FMS) 类似,可以在官方网站 ...

    ShareObject对象详解

    `var so:SharedObject = SharedObject.getLocal("mydata", "/");` 这行代码创建了一个名为“mydata”的本地共享对象,指定的路径"/"表示该对象将在应用程序的根目录下。 2. 存储数据: `var user:Object = new ...

    as3+red5电子白板demo

    Red5的`SharedObject`功能可以实现客户端之间的数据同步,确保所有用户看到的白板状态一致。 6. **网络通信**: AS3中的`NetConnection`和`NetStream`类用于与Red5服务器建立连接并发送/接收数据。`NetStatusEvent...

    libXp.so.6.zip

    libXp.so.6是这个库的特定版本,表示该库的第六个主要修订版,.so是“共享对象”(Shared Object)的缩写,这是Linux下的动态链接库文件格式。 在这个压缩包里,我们有两个文件:libXp-1.0.0-8.1.el5.i386.rpm和libXp...

    linux下安装MySQL数据库及相关配置

    - 错误信息:“mysql:error while loading shared libraries: libncursesw.so.5: cannot open shared object file: No such file or directory” - 解决方案:复制 `/usr/lib/` 目录下的 `libncurses.so.5` 并将其...

    linxu 下bugzilla安装

    这里指定了Apache的安装目录,并启用了DSO(Dynamic Shared Object)支持,使得Apache可以动态加载模块。 - 编译安装: ```bash make make install ``` ##### 2. 启动Apache服务 - 使用以下命令启动Apache: ``...

    第十九章 Linux的Apache服务器.docx

    - **DSO功能**:Dynamic Shared Object,支持动态加载模块,便于扩展功能。 - **多语言支持**:如JSP、PHP、CGI,可实现动态网页开发。 - **数据库支持**:兼容MySQL、PostgreSQL等数据库,用于存储网站数据。 - **...

    Linux命令的英文缩写

    - **.so**:Shared Object,表示共享库文件。 - **.o**:Object File,表示编译后的对象文件。 #### 四、包管理工具 - **RPM**:Redhat Package Manager,Red Hat发行版中的包管理工具。 - **dpkg**:Debian ...

Global site tag (gtag.js) - Google Analytics