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的方法来实现自己的逻辑。
简单的流程图:
- RTMPMinaIoHandler
- |--[delegate method call and pass RTMPMinaConnection to]-->RTMPHandler
- |--[call lookupGlobal method]-->Server
- |--[use globalScope to lookup webScope]-->GlobalScope
- |--[call connect method and pass WebScope to]-->RTMPMinaConnection
Red5如何启动?在它的启动过程中如何初始化这些关键类?
这里探讨的是Red5 standalone的启动过程(也就是我们执行red5.bat),关于Red5如何在tomcat中启动,目前仍在研究中。
Red5启动过程如下:
1.编辑red5.bat,找到关键的一行:
- C:\Program Files\Java\jre1.5.0_15\bin\java"
- -Djava.security.manager
- -Djava.security.policy=conf/red5.policy
- -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,这个下面会有介绍。
- try {
- ContextSingletonBeanFactoryLocator.getInstance(red5Config).useBeanFactory("red5.common");
- } catch (Exception e) {
-
- raiseOriginalException(e);
- }
3.查看red5.xml,这个文件首先定义了指向classpath:/red5-common.xml的名字为“red5.common”的BeanFactory,注意它会是整个BeanFactory层次中的根节点,所以在red5-common.xml中定义的bean可以被其他地方所引用。
- <bean id="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”,它会在接下来很多地方被用到。
- <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。
- <bean id="red5.core" class="org.springframework.context.support.FileSystemXmlApplicationContext">
- <constructor-arg><list><value>classpath:/red5-core.xml</value></list></constructor-arg>
- <constructor-arg><ref bean="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。
-
- <bean id="rtmpHandler"
- class="org.red5.server.net.rtmp.RTMPHandler">
- <property name="server" ref="red5.server" />
- <property name="statusObjectService" ref="statusObjectService" />
- </bean>
-
-
- <bean id="rtmpMinaIoHandler"
- class="org.red5.server.net.rtmp.RTMPMinaIoHandler">
- <property name="handler" ref="rtmpHandler" />
- <property name="codecFactory" ref="rtmpCodecFactory" />
- <property name="rtmpConnManager" ref="rtmpMinaConnManager" />
- </bean>
-
-
- <bean id="rtmpTransport" class="org.red5.server.net.rtmp.RTMPMinaTransport" init-method="start" destroy-method="stop">
- <property name="ioHandler" ref="rtmpMinaIoHandler" />
- 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
分享到:
相关推荐
像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...
STM32F103单片机读写 HC05蓝牙串口模块实验(函数库版)软件例程源码 int main(void) { u8 t; u8 key; u8 sendmask=0; u8 sendcnt=0; u8 sendbuf[20]; u8 reclen=0; delay_init(); //延时函数初始...
STM32F103单片机读写NEO-6M GPS模块实验(函数库版)软件例程源码 int main(void) { u16 i,rxlen; u16 lenx; u8 key=0XFF; u8 upload=0; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig...
像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...
STM32F103ZET6单片机数码相框-BMP图片显示实验软件例程源码 main() { u8 i=0,t; u8 key; u8 j, k; u8 dat[7] = {"0:/图片"}; //要显示的图片的文件地址 u8 picFile[30]; u8 num[6]; u32 sdCapacity, free; ...
#初始化 pygame.init() # 设置窗口大小 图片大小是460*532 , window = pygame.display.set_mode((460, 560)) # 设置窗口标题 if len(sys.argv) > 1: pygame.display.set_caption('Chinese Chess black') else: ...
STM32F407单片机读写SW-420震动模块传感器DEMO软件例程源码,可以做为你的学习设计参考。 int main(void) { uint32_t lcdid; /* 复位所有外设,初始化Flash接口和系统滴答定时器 */ HAL_Init(); /* 配置系统...
STM32F407IGT6单片机 HC-SR501人体红外感应液晶显示实验KEIL源码工程,可以做为你的学习设计参考。 int main(void) { uint8_t state; uint32_t lcdid; /* 复位所有外设,初始化Flash接口和系统滴答定时器 */ HAL...
6.2 初始化进程和启动脚本 90 6.2.1 init和/etc/inittab 90 6.2.2 /etc/inittab和系统状态 92 6.3 linuxconf与管理服务 96 6.4 关闭Linux系统 98 6.4.1 shutdown 98 6.4.2 halt与reboot 99 6.5 当系统崩溃时 100 ...
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'...
STM32F407IGT6单片机RFID射频(RC522)模块实验KEIL软件DEMO工程源码,可做为你的人学习设计参考。 int main(void) { /* 复位所有外设,初始化Flash接口和系统滴答定时器 */ HAL_Init(); /* 配置系统时钟 */ ...
DS18B20数字温度传感器实验STM32F407开发板KEIL软件工程源码 main(void) { u8 t=0; short temperature; HAL_Init(); //初始化HAL库 Stm32_Clock_Init(336,8,2,7); //设置时钟,168Mhz delay_init...
基于ADS1115和stm32f10数据采集系统源码+ADS1115数据手册,可做为你的学习设计参考。 int main(void) { float t1; u16 t,result; delay_init(); //延时函数初始化 NVIC_Configuration(); //设置NVIC...
STM32F103ZET6单片机 EN25Q128 FLASH字库实验软件例程源码 main() { u8 i=0; u8 key; SysTick_Init(72); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组 LED_Init(); USART1_...
DHT11数字温湿度传感器实验STM32F407开发板KEIL软件工程源码: main(void) { u8 t=0; u8 temperature; u8 humidity; HAL_Init(); //初始化HAL库 Stm32_Clock_Init(336,8,2,7); //设置时钟,168...
STM32103单片机读写OV2640 摄像头模块驱动测试程序工程源码,可以做为你的学习设计参考。 int main(void) { u8 res; u8 *pname; //带路径的文件名 u8 key; //键值 u8 sd_ok=1; //0,...
STM32单片机读写24位ADC_AD7190称重模块带液晶显示例程DEMO源码文件,可做为你的学习设计参考。 int main(void) { uint32_t lcdid; float data_temp; int32_t weight_count; uint8_t cali_flag=0; char str[50...
//初始化 Set_RxMode_MA(); //配置nRF24L01为接收模式 while(1) { if(NRF24L01_RxPacket_MA(RxPayload) == RX_OK) //如果接收成功 { if(RxPayload[0] == 0x5A) { RgbLed_Toggle(RGB_...
//LCD初始化 KEY_Init(); LCD_Clear(GREEN); LCD_ShowPictureEx(0, 0, 240, 320); TIM4_Init(10,7199); while(key!= KEY_UP) //等待按键K_UP按下 { FRONT_COLOR=RED; LCD_ShowString(20,10,tftlcd_...