- 浏览: 490022 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (185)
- job (15)
- linux/windows/unix/bash/shell (31)
- JAVA/J2EE/spring/hibernate/struts (30)
- VC/C++ (48)
- mysql/postgresql (6)
- php/jsp/asp/pear (1)
- FMS/flex/openlaszlo/red5/openmeetings (34)
- apache/tomcat/ftp/svn (6)
- xen/vm/Hadoop/cloudcompute (6)
- visual studio/eclipse/zendstudi/ant (8)
- others (1)
- windows异常处理 __try __except (1)
- (1)
- matlab (4)
- android (0)
最新评论
-
hongzhounlfd:
很透彻,很详细
依赖注入和控制反转 -
jefferyqjy:
谢谢~言简意赅~很明了!
依赖注入和控制反转 -
elderbrother:
太好了,谢谢
依赖注入和控制反转 -
east_zyd_zhao:
终于搞明白了
依赖注入和控制反转 -
Dremeng:
完美,一看就懂理解透彻
依赖注入和控制反转
Red5如何响应rmpt的请求,中间涉及哪些关键类?
响应请求的流程如下:
1.Red5在启动时会调用RTMPMinaTransport的start()方法,该方法会开启rmtp的socket监听端口(默认是1935),然后使用mina(apache的io操作类库)的api将RTMPMinaIoHandler绑定到该端口。
2.RTMPMinaIoHandler 上定义了messageReceived、messageSent、sessionOpened和sessionClosed等方法,当有socket请求时,相应的方法会被调用,这时RTMPMinaIoHandler会使用当前的socket连接来创建一个RTMPMinaConnection(或者使用一个之前创建好的RTMPMinaConnection),并将其作为参数传递给定义于RTMPHandler类上的相应的 messageReceived、messageSent、connectionOpened和connectionClosed方法。
3.RTMPHandler 会调用Server类的lookupGlobal获得当前的GlobalScope,然后再利用GlobalScope找到当前socket请求应该使用的WebScope(这个WebScope就是我们在自己的项目的WEB-INF/red5-web.xml中定义的啦)。最后,RTMPHandler 会调用RTMPMinaConnection的connect方法连接到相应的WebScope。
4.至此,控制流进入了我们自己项目中了,通常来说,WebScope又会将请求转移给ApplicationAdapter,由它来最终响应请求,而我们的项目通过重载ApplicationAdapter的方法来实现自己的逻辑。
简单的流程图:
- RTMPMinaIoHandler
- |--[delegatemethodcallandpassRTMPMinaConnectionto]-->RTMPHandler
- |--[calllookupGlobalmethod]-->Server
- |--[useglobalScopetolookupwebScope]-->GlobalScope
- |--[callconnectmethodandpassWebScopeto]-->RTMPMinaConnection
Red5如何启动?在它的启动过程中如何初始化这些关键类?
这里探讨的是Red5 standalone的启动过程(也就是我们执行red5.bat),关于Red5如何在tomcat中启动,目前仍在研究中。
Red5启动过程如下:
1.编辑red5.bat,找到关键的一行:
- C:/ProgramFiles/Java/jre1.5.0_15/bin/java"
- -Djava.security.manager
- -Djava.security.policy=conf/red5.policy
- -cpred5.jar;conf;binorg.red5.server.Standalone
可以看到它是调用org.red5.server.Standalone作为程序启动的入口,这也是为什么使用eclipse在debug模式下启动 Standalone就可以调试Red5代码。需要注意的是,如果你要调试Red5,记得除了源代码(src)之外,把conf和webapps两个文件夹都拷入项目中,并把conf加入classpath。
2.观察Standalone的main方法,你会看到它使用spring的ContextSingletonBeanFactoryLocator来载入classpath下面的red5.xml,注意ContextSingletonBeanFactoryLocator还会在下面的步骤中被使用,由于它是singleton的,所以保证了我们自己的项目中定义的bean可以引用red5.xml中定义的bean,这个下面会有介绍。
- try{
- ContextSingletonBeanFactoryLocator.getInstance(red5Config).useBeanFactory("red5.common");
- }catch(Exceptione){
- //Dontraisewrappedexceptionsastheirstacktracesmayconfusepeople...
- raiseOriginalException(e);
- }
3. 查看red5.xml,这个文件首先定义了指向classpath:/red5-common.xml的名字为“red5.common”的 BeanFactory,注意它会是整个BeanFactory层次中的根节点,所以在red5-common.xml中定义的bean可以被其他地方所引用。
-
<beanid="red5.common"
class="org.springframework.context.support.FileSystemXmlApplicationContext">
- <constructor-arg><list><value>classpath:/red5-common.xml</value></list></constructor-arg>
- </bean>
-
这里我们主要留意red5-common.xml中定义的类型为org.red5.server.Server的“red5.server”,它会在接下来很多地方被用到。
- <beanid="red5.server"class="org.red5.server.Server"/>
4.回到red5.xml,接着定义指向classpath:/red5-core.xml的名字为“red5.core”的BeanFactory,注意“red5.core”是以“red5.common”为parent context。
- <beanid="red5.core"class="org.springframework.context.support.FileSystemXmlApplicationContext">
- <constructor-arg><list><value>classpath:/red5-core.xml</value></list></constructor-arg>
- <constructor-arg><refbean="red5.common"/></constructor-arg>
- </bean>
查看red5-core.xml,这个文件主要定义了之前说过的RTMPMinaTransport,RMTPMinaIoHandler和 RTMPHandler这些类的Bean。对于RTMPMinaTransport,注意init-method="start"这段代码,这说明 RTMPMinaTransport的start方法会在该Bean初始化时调用,正如上面提到的,该方法会做开启1935端口,绑定 RTMPMinaIoHandler到该端口等等的操作。对于RTMPHandler,注意它的server属性通过“red5.server”引用了定义在parent context(red5-common.xml)上面的Server,通过它RTMPHandler能够找到GlobalScope,进而找到 WebScope。
- <!--RTMPHandler-->
- <beanid="rtmpHandler"
- class="org.red5.server.net.rtmp.RTMPHandler">
- <propertyname="server"ref="red5.server"/>
- <propertyname="statusObjectService"ref="statusObjectService"/>
- </bean>
- <!--RTMPMinaIOHandler-->
- <beanid="rtmpMinaIoHandler"
- class="org.red5.server.net.rtmp.RTMPMinaIoHandler">
- <propertyname="handler"ref="rtmpHandler"/>
- <propertyname="codecFactory"ref="rtmpCodecFactory"/>
- <propertyname="rtmpConnManager"ref="rtmpMinaConnManager"/>
- </bean>
- <!--RTMPMinaTransport-->
- <beanid="rtmpTransport"class="org.red5.server.net.rtmp.RTMPMinaTransport"init-method="start"destroy-method="stop">
- <propertyname="ioHandler"ref="rtmpMinaIoHandler"/>
- <propertyname="address"value="${rtmp.host}"/>
- <propertyname="port"value="${rtmp.port}"/>
- <propertyname="receiveBufferSize"value="${rtmp.receive_buffer_size}"/>
- <propertyname="sendBufferSize"value="${rtmp.send_buffer_size}"/>
- <propertyname="eventThreadsCore"value="${rtmp.event_threads_core}"/>
- <propertyname="eventThreadsMax"value="${rtmp.event_threads_max}"/>
- <
propertyname="eventThreadsQueue"value="${rtmp.event_threads_queue}"/>
- <propertyname="eventThreadsKeepalive"value="${rtmp.event_threads_keepalive}"/>
- <!--Thisistheintervalatwhichthesessionsarepolledforstats.Ifminamonitoringisnotenabled,pollingwillnotoccur.-->
- <propertyname="jmxPollInterval"value="1000"/>
- <propertyname="tcpNoDelay"value="${rtmp.tcp_nodelay}"/>
- </bean>
-
5.再次回到red5.xml,接下来定义类型为org.red5.server.ContextLoader的bean,并在初始化后调用它的init方法。
- <beanid="context.loader"class="org.red5.server.ContextLoader"init-method="init">
- <propertyname="parentContext"ref="red5.common"/>
- <propertyname="contextsConfig"value="red5.globals"/>
- </bean>
查看该方法的源代码,可以看到它会读取在classPath下面的red5.globals文件,对于每一行初始化一个以“red5.common”为 parent context的BeanFactory,具体来说,现在red5.globals中只有一行 default.context=${red5.root}/webapps/red5-default.xml,那么会创建一个名字为 “default.context”的指向webapps/red5-default.xml的Bean Factory,它以“red5.common”为parent context。
- protectedvoidloadContext(Stringname,Stringconfig){
- log.debug("Loadcontext-name:"+name+"config:"+config);
- ApplicationContextcontext=newFileSystemXmlApplicationContext(
- newString[]{config},parentContext);
- contextMap.put(name,context);
- //addthecontexttotheparent,thiswillbered5.xml
- ConfigurableBeanFactoryfactory=((ConfigurableApplicationContext)applicationContext)
- .getBeanFactory();
- //Registercontextinparentbeanfactory
- factory.registerSingleton(name,context);
- }
查看red5-default.xml,发现它主要是定义了GlobalScope的bean,然后把它注册到“red5.server”上。
9. 最后查看webapps/oflaDemo/WEB-INF/red5-web.xml,它定义了类型为 org.red5.server.WebScope的bean,初始化了它的server(指向“red5.server”),parent(指向 “global.scope”)等属性,最后调用它的register方法初始化,查看该方法源代码,发现它会把自己注册到GlobalScope上面,至此所有的关键类的初始化完毕。
8.查看webapps下的项目,这里以oflaDemo为例,查看WEB-INF下面的web.xml,发现有以下三个参数 contextConfigLocation,locatorFactorySelector和parentContextKey,同时还有一个 org.springframework.web.context.ContextLoaderListener。
- <beanid="global.scope"class="org.red5.server.GlobalScope"init-method="register">
- <propertyname="server"ref="red5.server"/>
- <propertyname="name"value="default"/>
- <propertyname="context"ref="global.context"/>
- <propertyname="handler"ref="global.handler"/>
- <propertyname="persistenceClass">
- <value>org.red5.server.persistence.FilePersistence</value>
- </property>
- </bean>
6.继续看red5.xml,最后定义类型为org.red5.server.jetty.JettyLoader的bean,并且在初始化后调用它的init方法,查看该方法源代码,很明显它是初始化并且启动jetty这个web server。
- <beanid="web.scope"class="org.red5.server.WebScope"init-method="register">
- <propertyname="server"ref="red5.server"/>
- <propertyname="parent"ref="global.scope"/>
- <propertyname="context"ref="web.context"/>
- <propertyname="handler"ref="web.handler"/>
- <property
-
name="contextPath"value="${webapp.contextPath}"/>
- <propertyname="virtualHosts"value="${webapp.virtualHosts}"/>
- </bean>
-
Spring beanFactory 的层次图
- conf/red5-common.xml->webapps/red5-default.xml->webapps/oflaDemo/WEB-INF/red5-web.xml
这就使得red5-web.xml可以使用red5-common.xml和red5-default.xml中定义的bean。
- conf/red5-common.xml
- |--conf/red5-core.xml
- |--webapps/red5-default.xml
- |--webapps/root/WEB-INF/red5-web.xml
- |--webapps/SOSample/WEB-INF/red5-web.xml
- |--webapps/oflaDemo/WEB-INF/red5-web.xml
看清了Red5 Standalone的启动过程,感觉为了实现自定义项目集成到Red5的核心服务上,Red5 Standalone非常依赖于spring的多个Bean Factory之间的复杂层次关系,之所以Red5能建立这样一种层次关系,是因为它能够控制jetty这样一个嵌入式的web server。问题在于,一旦Red5需要作为一个web app运行在类似Tomcat这样的独立的web server上面,那么整个过程就很不一样了,所以后很多东西都要改,我想这也是为什么Red5 0.8 RC1为什么只有安装版但还没有war版的原因。
- <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>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
-
</listener>
查看这个listener的javadoc,其实这个listener会在web app(就是我们自己的项目)启动时,创建一个指向contextConfigLocation(其实就是WEB-INF/red5-web.xml)的 Bean Factory,同时为它设置parent context。这个parent context实际上是使用locatorFactorySelector找到ContextSingletonBeanFactoryLocator,进而使用parentContextKey找到定义在这个locator里面的Bean Fanctory,由于ContextSingletonBeanFactoryLocator是singleton的,所以这个 ContextSingletonBeanFactoryLocator对象跟我们在第2步中拿到的对象是一样的,而由于 parentContextKey被设置成“default.context”,这就意味着该parent context是第5步中定义的名为“default.context”的Bean Factory。基于以上的参数,我们得到这样一个Bean Factory的链条,由上至下分别是
- <beanid="jetty6.server"class="org.red5.server.jetty.JettyLoader"init-method="init"autowire="byType"depends-on="context.loader">
- <propertyname="webappFolder"value="${red5.root}/webapps"/>
- </bean>
7. 到了这里似乎所有的初始化和启动都完毕了,但是问题就来了,这里仅仅定义了RTMPMinaIoHandler,RTMPHandler,Server和 GlobalScope,但是在我们之前提到过的Red5响应rmpt的请求的过程中,还需要有WebScope来最终处理 RTMPMinaConnection,这个WebScope又是怎么配置并且加进来的呢?
最后,如果哪位成功在Tomcat上配置过Red5 0.7的war版本,还请告诉我一声,我试了0.6的war可以,不知道0.7为什么老不行。。。
发表评论
-
Red5安装和配置
2011-02-24 10:23 4020Red5安装和配置参考网页:http://www.cahblo ... -
基于Moodle平台的网站调查报告
2011-02-24 10:18 2537基于Moodle平台的网站调查报告 网站举例: ² 西南 ... -
moodle插件模块功能汇总
2011-02-24 10:03 4964Moodle官方提供654种插件或者模块moodle.org ... -
moodle 一体包安装手册(window)
2011-02-24 09:55 1254见附件 -
moodle中上传文件大小控制
2011-02-24 09:51 1807第一步:修改在php4下POST文件大小的限制1.编修php. ... -
linux下面安装moodle
2011-02-24 09:50 20551. 安装moodle运行 ... -
OpenMeetings安装文档
2011-02-15 11:09 2571OpenMeetings 是一个多语言可定制的视频会议和协作系 ... -
Compilation and Execution (openlaszlo)
2010-11-22 11:02 10237. Compilation and Exe ... -
Combining Tags and Script in LZX Programs (openlaszlo)
2010-11-22 11:01 12886. Combining Tags and ... -
Data Access, Manipulation, and Binding (openlaszlo)
2010-11-22 10:33 11645. Data Access, Manipu ... -
Constraints(openlaszlo)
2010-11-22 10:18 1099constraint 表示可变的变量赋值形式 In LZX, ... -
Events and Methods (openlaszlo)
2010-11-22 09:35 13383. Events,Methods ,han ... -
Dimdim&Moodle安装配置文档节选
2010-11-09 17:40 2517Dimdim&Moodle安装配置文档节选 ... -
Red5如何响应rmpt的请求,中间涉及哪些关键类?
2010-11-01 15:35 1510Red5如何响应rmpt的请求,中间涉及哪些关键类? 响应请 ... -
red5的eclipse插件和用法
2010-10-30 20:56 1113参见http://www.red5.org/wiki/Red5 ... -
red5集群分析
2010-10-28 19:42 49911. 边(Edge ): 1. 边的主要作用是管理连接,并可以 ... -
创建第一个red5程序
2010-10-25 15:33 21151.下载最新版本的RED5 http://osflash.or ... -
openlaszlo中多媒体组件介绍
2010-10-14 15:50 1099在openlaszlo中我们可以处理图像,音视频等媒体文件。详 ... -
openlaszlo组件的简单介绍
2010-10-14 15:50 1259openlaszlo组件的简单介绍 收藏 在写laszlo ... -
创建一个简单的openlaszlo程序
2010-10-14 15:49 1035前面说到过openlaszlo程序是一组xml格式和javas ...
相关推荐
red5 流媒体 源代码
我研究生阶段研究定的方向是网络拥塞管理,而我研究RED算法也有挺长时间了,很久以前就有解析NS中的队列管理算法RED的源代码(red.cc&red.h)的想法,借寒假有时间,匆匆写了一下。有些东西自己也没完全弄懂,但是...
1.Red Gate 性能分析及反编译工具(ANTS Performance Profiler Pro, ANTS Memory Profiler, .NET Reflector VSPro)的(都为8.1以上版本)安装文件DotNETDeveloperBundle.exe,或则你也可以到官网下载最新版...
首先声明,这段源代码不是我编写的,让我们感谢这位名叫Carl Harris的大虾,是他编写了这段代码并将其散播到网上供大家学习讨论。这段代码虽然只是描述了最简单的proxy操作,但它的确是经典,它不仅清晰地描述了客户...
Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...
这是最新的版本,对基于NS2的主动队列管理算法RED,ARED进行了代码层面的分析。
前端开源库-node-red-node-serialport节点红色节点串行端口,节点红色节点与串行端口通信
网络ns2仿真实验分析(RED、丢包率、端到端延迟、吞吐量)附源码
Red:终端日志分析工具
20170304此目录下是归并排序的源代码,你可以在找到我对这个算法的解析。20170305此目录下是快速排序的源代码,你可以在找到我对这个算法的解析。20170307此目录下包含优先权的三种实现方式以及堆排序的源代码,你...
9.1.2 自己构造源代码 156 9.2 服务器运行配置的设置 157 9.2.1 编辑httpd.conf文件 158 9.2.2 .htaccess文件和访问限制 160 9.3 虚拟主机 161 9.3.1 基于地址的虚拟主机 161 9.3.2 基于名字的虚拟主机 162 9.4 日志...
Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...
5.匹配日期 6 匹配电话; 7 匹配身份证 8 匹配邮编代码 9. 不包括特殊字符的匹配 (字符串中不包括符号 数学次方号^ 单引号' 双引号" 分号; 逗号, 帽号: 数学减号- 右尖括号> 左尖括号反斜杠\ 即空格,制表符,回车符...
节点红项目组成必须先安装git。 有关详细数据,请参阅Excel文件。列表01-安装并运行02-mongodb,studio 3T,Roto 3T的安装和使用03-如何使用节点红色项目04-安装mongodb罗盘并设置mongodb密码05-设置节点红色密码06-...
协议解码和分析工具 BlueZ内核模块,程序开发库和小工具能在支持Linux的多种硬件架构系统上运行,既支持单核也支持多核处理器。BlueZ主要支持以下系统平台: Intel and AMD x86 AMD64 and EM64T (x86-64) SUN ...
MATLAB智能算法的源代码%% 清空环境 clc;clear %% 障碍物数据 position = load('barrier.txt'); plot([0,200],[0,200],'.'); hold on B = load('barrier.txt'); xlabel('km','fontsize',12) ylabel('km','fontsize'...
源码之前了无秘密,你将看到vector的实现、list的实现、heap的实现、deque的实现、Red Black tree的实现、hash table的实现、set/map的实现;你将看到各种算法(排序、查找、排列组合、数据移动与复制技术)的实现;...
为方便读者阅读本书和调试程序,随书附带的光盘中有全书所有实例的源代码。光盘中的内容具体如下: (1)实例源代码 第1章:基本对话框; 第2章:布局管理; 第3章:对话框进阶; 第4章:QMainWindow; ...