1、UsageEnvironment
UsageEnvironment代表了整个程序的运行环境,其中保存了一些全局变量,定义了一些输出函数(纯虚函数)。从这些输出函数就可以看出该类主要用于充当程序的全局上下文,并提供打印信息的输出。
BasicUsageEnvironment0继承自UsageEnvironment,实现了其中的纯虚函数。
BasicUsageEnvironment继承自BasicUsageEnvironment0,主要定义了一个静态的createNew()函数,用于类的实例化。继承关系如下:
2、TaskScheduler
TaskScheduler是整个程序的任务调度器,通过doEventLoop()函数实现程序的循环结构,在这里进行任务的调度,在taskScheduler中一共有三种类型的任务,sockethandler、eventhandler、delaytask。在TaskScheduler种主要定义了这三种任务的添加、删除与执行的机制,具体的实现需要子类去做。
BasicTaskSchedule0对TaskScheduler中的方法进行了初步实现,例如在doEventLoop()中实现了大循环while(1)
,同时又添加了一个虚函数SingleStep(),在这里将实现具体的事件执行步骤。
BasicTaskScheduler继承自BasicTaskScheduler0,添加了createNew()的静态方法用于实例化,实现了singleStep(),同时添加了一些对socketHandler任务的操作。在singleStep中就是对上面的三个任务进行处理,1.处理一个socketHandlers任务;2.处理一个eventHandler任务;3.处理一个delayTask任务。
socketHandlers,这个任务用于处理socket的数据接受与发送,是整个程序中最主要的一个任务,因为在流媒体服务器中主要工作就是数据的发送与接受
eventHandler,这个任务暂时还不知道是用来做什么的,在BasicTaskScheduler0中对进行的添加、触发等操作做了实现,但是都没有被其他地方调用
delayTask,这个任务可以用于轮询,比如判断一个任务是否已完成,则将判断的函数加入延时,不断调用自身进行询问。
turnOnBackgroundReadHandling和turnOffBackgroundReadHandling分别控制让socket可读或不可读,里面是调用setBackgroundHandling实现的。在BasicTaskScheduler中对setBackgroundHandling做了具体的实现,会将该socket加入fHandler的队列或从中移除。
3、RTSPServer
RTSPServer负责管理具体的会话内容,包括ServerMediaSession、ServerMediaSubSession。
其中用HashTable来存储这些内容:
fServerMediaSession存储ServerMediaSession;
fClientConnections存储RTSPClientConnection;
fClientSessions存储RTSPClientSession;
还保存有用于连接的socket:fRTSPServerSocket,端口fRTSPServerPort;
方法:
addMediaSession,会先查找记录里是否存在相同名称的ServerMediaSession,删除后再添加;
closeAllClientSessionsForServerMediaSession,将指定ServerMediaSession下的所有RTSPCLientSession删除;
createNew,静态方法,初始化RTSPServer,其中会根据port创建一个socket,初始化数据存储的HashTable,然后将socket加入socket Handlers进入大循环,等待客户端的连接;
createNewClientConnection,创建RTSPClientConnection,会将自身传入变为fOurServer,还有serverSocket监听创建好的clientSocket,clientPort,这个方法就是在serverSocket监听的有客户端连接的时候进行创建的;之后将该客户socket放进大循环,读取请求
createNewClientSession,创建clientSession,在从clientConnection接到SETUP消息时使用此方法创建ClientSession,用于接下来的请求SETUP、PLAY;
deletServerMediaSession,将记录里面的指定ServerMediaSession删除;
incomingRTSPConnecionHandler,用于serverSocket大循环的回调,也就是说监听到客户端连接了,然后创建RTSPClientConnection;
lookupByName,只是用来看该RTSPServer是否已创建;
lookupServerMediaSession,从记录里查找是否存在;
lookupURLPrefix只是用来得到客户的IP地址的。。。
RTSPServerSupportingHTTPStream添加了对HTTP连接的支持,可以监听HTTP的连接请求;
DynamicRTSPServer对RTSPServer的lookupServerMediaSession进行了覆写,改变了查找机制,原来查找不到会返回空,而这里则会主动创建一个。该函数首先会在程序目录下寻找是否有对应的文件,这也就说明了为什么liveMediaServer规定文件一定要放在同一目录下了。
该类中还定义了一个全局方法createNewSMS,会根据文件名的后缀创建对应的***ServerMediaSubSession,并添加到相应的ServerMediaSession记录里。