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;
}
...
}
分享到:
相关推荐
RED5配置文件详解 RED5是一个开源的流媒体服务器,基于Jetty6(Servlet引擎)和Mina(网络编程库)构建,并集成了Spring框架。本文档旨在帮助初学者理解和配置RED5服务器的关键文件,以确保顺利运行和自定义设置。 ...
Red5 是一款开源的流媒体服务器,常用于开发基于Flex的视频会议系统。本文将详细介绍如何配置Red5,以便发布和使用视频流。 首先,创建Red5应用程序涉及到以下几个步骤: 1. **创建应用程序目录**:在Red5的根目录...
Red5还支持共享对象(SharedObject),这是一种在客户端和服务器之间共享数据的机制,类似于Web浏览器中的cookie,但具有更大的存储容量和更低的延迟。 在“基于red5的多人聊天”项目中,SharedObject起到了关键...
关于Red5配置详解 Red5是一款开源的流媒体服务器,它允许开发者创建实时的音频、视频流,并且支持录制、播放、互动等多媒体应用。在安装Red5之后,配置是确保其正常运行的关键步骤。本篇文章将深入探讨Red5的配置...
Red5 是一款开源的流媒体服务器,主要用于处理基于Flash的实时音视频流。它支持RTMP、RTMPT、RTMPS、RTMPE等多种协议,适用于直播、点播、录制等多种应用场景。以下是对Red5安装和入门配置的详细解释: 1. **Red5 ...
Red5是一个开源的流媒体服务器平台,它提供了与Macromedia公司的Flash Media Server(FMS)相似的功能,主要支持基于Adobe Flash平台的实时通信应用,如音频、视频流,以及共享对象通信等。Red5利用Java语言开发,...
3. **SOSampleDemo**:SOSample是一个示例应用,展示了如何使用Red5的SharedObject服务。SharedObject是Flash中的一个特性,类似于Web存储,允许在客户端和服务器之间共享数据。SOSample可以帮助开发者理解如何在Red...
SharedObject则提供了客户端和服务器间的数据共享机制,特别适用于实现游戏中的同步操作。 编写第一个程序包括创建服务器端和客户端代码。服务器端通常用Java编写,实现所需的服务接口;客户端代码则采用...
1. **Red5 服务器**:Red5 是一个开源的流媒体服务器,支持 RTMP(Real Time Messaging Protocol)、RTMPT、RTMPE、RTMPTE、RTMPS 协议,用于实时音频、视频传输,以及数据共享。它允许开发者创建互动的媒体应用程序...
- **概念解析**:SharedObject是Red5中用于存储跨连接会话数据的机制,能够在不同用户间共享信息,适用于游戏中的移动同步等场景。 - **移动同步原理**:通过SharedObject,游戏中的玩家移动和其他动态信息能够实时...
【Red5 开发详解】 Red5 是一款基于 Java 开发的开源流媒体服务器,与 Adobe 的 Flash Media Server (FMS) 类似,提供多种功能,包括流媒体传输、录制、共享对象、远程调用等。它支持RTSP协议,允许在下载过程中...
《Red5服务器详解及其核心组件——以red5-war-0.8.0.zip中的red5.jar为例》 在IT行业中,尤其是在线媒体流服务领域,Red5是一个非常重要的开源服务器平台。它支持实时流传输协议(RTMP),使得开发者能够构建实时...
### 基于Red5的流媒体服务器搭建与应用详解 #### 一、Red5概述 **Red5**是一款基于Java开发的开源免费Flash流媒体服务器。它利用Java语言及一系列强大开源框架构建而成,为企业的各类应用提供了坚实的基础。Red5...
Red5 1.0 Final是该软件的一个稳定版本,为用户提供了一个可靠的平台来处理多媒体数据。 在整合Red5 1.0 Final与Apache Tomcat时,我们首先要理解这两个组件的角色。Red5作为一个流媒体服务器,负责处理和分发...
Red5是一款开源的流媒体服务器,它支持实时流传输协议(RTMP),并提供录制、播放、存储等功能,广泛应用于在线视频直播、VoIP、互动游戏等场景。本教程将介绍如何进行Red5的入门学习,并结合Tomcat和MyEclipse进行...
5. **互动性**:Red5 Server支持与客户端的双向通信,例如通过Flash的SharedObject实现聊天室功能,或者进行游戏交互等。 6. **Java平台**:Red5 Server是用Java语言编写的,这意味着它可以在任何支持Java的平台上...
根据提供的文档信息,本文将详细阐述如何使用FFmpeg和Red5搭建一个RTMP流媒体服务器,以及相关的配置和测试步骤。 首先,了解RTMP(Real Time Messaging Protocol)是一种网络协议,它被广泛用于在线直播和流媒体...
Red5是一款开源的流媒体服务器,它支持实时流传输协议(RTMP)、RTMPT、RTMPE、RTMPS以及HLS等协议,能够处理音视频数据的录制、播放和存储。在Web开发中,尤其是涉及到在线直播、互动聊天等应用场景时,Red5是一个...
Red5 Server是一款开源的流媒体服务器,主要用于处理和分发实时数据流,如视频、音频和其他类型的数据。这个"red5-server.zip"压缩包提供了一个免安装版本,使得用户可以在本地快速搭建起一个流媒体服务器,无需复杂...