`

Red5源代码分析 - 关键类及其初始化过程

    博客分类:
  • RED5
阅读更多

http://blog.csdn.net/zlxluofeng/archive/2010/05/11/5579257.aspx

 

原文地址:http://semi-sleep.iteye.com/blog/348768

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的方法来实现自己的逻辑。

简单的流程图:

 

  1. RTMPMinaIoHandler      
  2.   |--[delegate method call and pass RTMPMinaConnection to]-->RTMPHandler     
  3.      |--[call lookupGlobal method]-->Server     
  4.      |--[use globalScope to lookup webScope]-->GlobalScope     
  5.      |--[call connect method and pass WebScope to]-->RTMPMinaConnection    

 

Red5如何启动?在它的启动过程中如何初始化这些关键类?

这里探讨的是Red5 standalone的启动过程(也就是我们执行red5.bat),关于Red5如何在tomcat中启动,目前仍在研究中。

Red5启动过程如下:

1.编辑red5.bat,找到关键的一行:

 

  1. C:\Program Files\Java\jre1.5.0_15\bin\java"      
  2.   -Djava.security.manager      
  3.   -Djava.security.policy=conf/red5.policy      
  4.   -cp red5.jar;conf;bin org.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,这个下面会有介绍。

 

  1. try {     
  2.     ContextSingletonBeanFactoryLocator.getInstance(red5Config).useBeanFactory("red5.common");     
  3. catch (Exception e) {     
  4.     // Don't raise wrapped exceptions as their stacktraces may confuse people...     
  5.     raiseOriginalException(e);     
  6. }    

 

3.查看red5.xml,这个文件首先定义了指向classpath:/red5-common.xml的名字为“red5.common”的BeanFactory,注意它会是整个BeanFactory层次中的根节点,所以在red5-common.xml中定义的bean可以被其他地方所引用。

 

  1. <bean id="red5.common" class="org.springframework.context.support.FileSystemXmlApplicationContext">  
  2.     <constructor-arg><list><value>classpath:/red5-common.xml</value></list></constructor-arg>  
  3. </bean>  

 

这里我们主要留意red5-common.xml中定义的类型为org.red5.server.Server的“red5.server”,它会在接下来很多地方被用到。

 

  1. <bean id="red5.server" class="org.red5.server.Server"/>  

 

4.回到red5.xml,接着定义指向classpath:/red5-core.xml的名字为“red5.core”的BeanFactory,注意“red5.core”是以“red5.common”为parent context。

 

  1. <bean id="red5.core" class="org.springframework.context.support.FileSystemXmlApplicationContext">  
  2.     <constructor-arg><list><value>classpath:/red5-core.xml</value></list></constructor-arg>  
  3.     <constructor-arg><ref bean="red5.common" /></constructor-arg>  
  4. </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。

 

  1. <!-- RTMP Handler -->  
  2. <bean id="rtmpHandler"  
  3.     class="org.red5.server.net.rtmp.RTMPHandler">  
  4.     <property name="server" ref="red5.server" />  
  5.     <property name="statusObjectService" ref="statusObjectService" />  
  6. </bean>  
  7.   
  8. <!-- RTMP Mina IO Handler -->  
  9. <bean id="rtmpMinaIoHandler"  
  10.     class="org.red5.server.net.rtmp.RTMPMinaIoHandler">  
  11.     <property name="handler" ref="rtmpHandler" />  
  12.     <property name="codecFactory" ref="rtmpCodecFactory" />  
  13.     <property name="rtmpConnManager" ref="rtmpMinaConnManager" />  
  14. </bean>  
  15.   
  16. <!-- RTMP Mina Transport -->  
  17. <bean id="rtmpTransport" class="org.red5.server.net.rtmp.RTMPMinaTransport" init-method="start" destroy-method="stop">  
  18.     <property name="ioHandler" ref="rtmpMinaIoHandler" />  
  19. padding-top: 0px !important; padding-right: 3px !important; padding-bottom: 0px !important; padding-left: 10px !important; border-top-style: none; border-right-style: none; border-bo
    分享到:
    评论

相关推荐

    red5-1.0.0-RC1.zip

    7. **boot.jar**: 这个JAR文件是Red5服务器启动时加载的第一个JAR,负责初始化服务器环境,加载配置,并启动核心服务。 8. **Makefile**: Makefile是一个用于自动化构建过程的文件,通常在Unix/Linux环境中使用。它...

    red5-eclipse-plugin-master.zip

    - **代码编辑与调试**:该插件提供了对Red5项目的源代码编辑支持,包括自动补全、语法高亮、错误检查等功能,极大地提高了编码效率。同时,还集成了调试工具,允许开发者在Eclipse环境中直接对Red5应用进行断点调试...

    red5聊天室、视频、用户列表的源代码

    根据提供的文件信息,我们可以深入分析该聊天室项目的关键技术点及其实现原理。 ### 一、Red5服务器端应用实现 #### 1.1 应用基础结构 在Red5服务器中,应用程序通常通过继承`ApplicationAdapter`类来实现。在这个...

    C#127初始化颜色对话框自定义颜色集 源代码

    通过分析和学习这个源代码,你可以了解到如何在实际项目中应用这些概念。 总的来说,初始化颜色对话框并自定义颜色集是C#中提升用户体验的一个实用技巧。通过设置`ColorDialog`的`CustomColors`属性,开发者可以为...

    red5的eclipse/myeclipse插件及安装

    - 项目模板:提供预设的Red5项目结构,简化项目初始化。 - 部署工具:方便地将项目部署到本地或远程的Red5服务器。 - 调试支持:设置断点,单步执行,查看变量值,帮助找出代码中的错误。 总的来说,Red5的Eclipse/...

    WEB-INF.zip_WORKING_red5_web

    - 通过分析oflaDemo的源代码,开发者可以学习如何在自己的应用中集成Red5的功能。 总的来说,这个压缩文件包含了一个运行中的Red5服务器的`WEB-INF`目录,其中的`red5-web.properties`和`web.xml`是理解并配置Red5...

    搭建red5流媒体服务器1

    1. **下载Red5**:访问Red5官方网站或其他可信源下载Red5-1.0.0-with-oflaDemo压缩包。 2. **解压Red5**:将下载的压缩包解压到合适的位置。 3. **启动Red5**:在解压后的目录下,找到`red5.bat`(Windows环境下)或...

    Android应用源码之Red5+Android 直播系统的架构服务端的直播流

    下面我们将深入解析Red5在Android直播系统中的作用以及相关技术知识点。 首先,我们需要理解Red5的工作原理。Red5服务器支持RTMP(Real-Time Messaging Protocol)协议,这是一种用于实时数据通信的协议,常用于...

    android直播推流的Demo,使用red5的服务器

    - **关键类解析**:主活动可能是启动推流的入口,负责初始化和配置推流参数。Service则负责持续推流,防止因为界面销毁而中断。BroadcastReceiver可能用于监听网络状态,确保推流的稳定性。 - **代码实现**:查看`...

    AQM算法 LRED的源代码

    `lred.cc`通常包含了LRED算法的函数实现,包括初始化、更新状态、决定是否丢弃数据包等核心功能。而`lred.h`文件则定义了相关的结构体、变量和函数原型,供其他模块调用和实现。 在LRED的初始值设置中,可能涉及...

    队列管理算法RED源码全解全析v0.12

    主动队列管理(Active Queue ...通过对NS2中的RED源代码分析,我们可以了解到如何实现实时的队列管理策略,并为自定义或改进AQM算法提供参考。无论是学术研究还是实际网络部署,理解和掌握RED都是必不可少的知识点。

    Red5+H5实现点播和直播

    SQL文件包含创建表的语句以及初始化数据的插入操作。例如,用户表的创建可以通过以下SQL语句完成: ```sql CREATE TABLE `user_table` ( `user_id` int(32) NOT NULL AUTO_INCREMENT, `username` varchar(30) NOT ...

    Red5+Android 直播系统的架构服务端的直播流工程

    通过研究这些源代码,开发者可以深入理解如何将Red5与Android结合,构建完整的直播解决方案,包括如何初始化和配置Red5服务器,以及如何在Android应用中集成RTMP库进行直播和播放。 总的来说,构建一个Red5与...

    red-black-tree-c.rar_red black tree_tree c语言

    2. 初始化:为了创建一个空的红黑树,需要编写一个初始化函数,将根节点设置为黑色。 3. 插入操作:插入新节点时,需要遵循红黑树的性质进行旋转和重新着色。这通常涉及左旋、右旋、颜色调整等步骤。 4. 删除操作:...

    基于flex 和red5的视频聊天

    1. **客户端初始化**:用户打开视频聊天应用,Flex客户端请求访问用户的摄像头和麦克风,并建立与Red5服务器的连接。 2. **流媒体发布**:客户端通过RTMP协议将摄像头和麦克风的输入流发布到Red5服务器的特定通道。...

    red5 与TOMCAT整合 (英文)

    这些上下文定义了如何初始化和配置RED5的服务及组件,确保它们能够正确地与TOMCAT协同工作。 #### 7. **外部应用程序** - 对于不通过HTTP访问的应用程序,可能不需要Web/Servlet上下文。这为非Web服务提供了直接...

    在 eclipse 中使用 tomcat 像开发普通 JEE 项目一样开发 RED5 项目

    这通常通过在RED5的上下文初始化文件(如`context.xml`)中声明Bean来完成。 在Eclipse中测试和调试RED5项目,你需要将项目部署到Tomcat服务器上。首先,确保Tomcat已启动。然后: 1. 右键点击项目,选择"Run As" ...

    从硬盘安装RHEL 5(Red Hat Enterprise Linux 5)

    这些ISO文件包含了RHEL 5安装所需的全部组件和软件包,其中第一张光盘包含核心系统和常用工具,后续光盘则包含额外的软件包、文档和源代码等。 #### 知识点三:使用Grub for DOS安装RHEL 5 - **准备Grub for DOS*...

    nodered-js-output-debug:NodeRED调试输出节点作为Kevoree库

    总的来说,这个项目提供了一种在NodeRED中方便地调试JavaScript代码的解决方案,利用Kevoree的特性增强了调试能力,并且通过Yeoman生成器简化了项目的初始化过程。对于开发者来说,这极大地提高了工作效率,使得在...

Global site tag (gtag.js) - Google Analytics