服务器主程序
如下图,建议点开放大观看,先有个整体印象,细心的读者会发现包含的头文件格式为.hh,.hh 是为了区别 .h,作用只是为了区别而已,可忽略。
这里面涉及类的关系错综复杂,但是官方为了方便我们理解其类之间的继承,依赖等关系提供了文档以及帮助说明,详情可点击以下网址:进行查阅。本文关系类截图也是来源于下面网址
http://www.live555.com/liveMedia/doxygen/html/annotated.html
http://www.live555.com/liveMedia/doxygen/html/classes.html
BasicTaskScheduler和BasicUsageEnvironment
Main函数里面前两行:
这里是典型的一个多态,先把其关系结构图附上:
UsageEnvironment有个类成员, TaskScheduler& fScheduler;根据上述关系图印证二者的依赖关系。
BasicTaskScheduler 类中的 createNew()函数直接 new 了一个 BasicTaskScheduler 对象,默认传入的构造参数为
unsigned maxSchedulerGranularity=10000 毫秒
根据继承关系 BasicTaskScheduler0构造函数如下,先执行基类,而
继续看BasicTaskScheduler的构造函数:
传入默认参数已经大于0,所以执行schedulerTickTask()
void BasicTaskScheduler::schedulerTickTask()
{
scheduleDelayedTask(fMaxSchedulerGranularity, schedulerTickTask, this);
}
而scheduleDelayedTask函数是在BasicTaskScheduler0类中实现,如下图:
注意参数里面的宏定义:
typedef void TaskFunc(void* clientData); 该宏定义意思是定义了一个函数指针 该指针指向的函数返回值为void 参数为(void* clientData)
typedef void* TaskToken;
scheduleDelayedTask第二个参数穿进去的就是个函数指针。
这个函数又涉及三个类,分别是DelayInterval ,AlarmHandler,DelayQueue。
DelayInterval
该类主要是时间相关的一些操作,这里先不深究了。
AlarmHandler:
到这里要注意scheduleDelayedTask传进来的参数到了alarm里面的fProc和fClientData了。
DelayQueue:
这里fDelayQueue调用addEntry的方法然后穿进去一个地址赋值给newEntry。
关于上面三个类的详细说明可以参考以下链接介绍:
AlarmHandler https://www.cnblogs.com/oloroso/p/4596870.html
DelayQueue https://www.cnblogs.com/oloroso/p/4596854.html
其中DelayQueue 为延时队列类,主要作用是为了实现单线程多并发。这里不再复述。进而,整个 BasicTaskScheduler::createNew()执行完毕,下面回到 main()函数中,执行如下语句:
UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler);
构造函数如下:
回到main继续往下执行:
简单查看该UserAuthenticationDatabase类为管理员的类,这边不重要先略过!
我们接着往下看!
RTSPServer类:
DynamicRTSPServer类:
这个类就比较重要了~~!准确的说这个类提供了RTSP的服务!
建议大家放大点开看看吧!~太复杂!!!!!!!!!这个关系我先不说了!!哪位高人说一下!
继续说这个函数~!这边应该建立了个套接字!
然后构造
先看最上层的父类构造函数,注意参数env 那个是环境参数传进来了!
其次
注意:从后面可以了解到,上面函数的最后一条语句的作用是,将 fRTSPServerSocket 添加到 Live555 的读监听描述符集,然后当有客户端发起连接时,系统获知,然后回调 incomingConnectionHandlerRTSP()函数。(正如其名称所示)
继续看:
fHandlers 为 BasicTashScheduler0 的成员变量,类型为 HandlerSet,在其构造函数中创建。我们先看 HandlerSet
类的构造函数。
继续往下看在 RTSPServerSupportingHTTPStreaming 类的构造函数中,没有做具体实际的动作,略。
最后,在 DynamicRTSPServer 类的构造函数中,也没有做具体实际的动作。
回到主函数中,执行如下语句:
向屏幕输出相应的字符!
然后回到主函数,
启动了Live555的程序!
再研究下这个doEvenLoop!
上图中是整个程序的核心的代码~主要流程是select io复用然后从延时队列里面找相应的io事件~整个是单进程的操作!
其实我大概理了一下程序的流程,如果细细琢磨只能一行一行看了。而且该开源项目,类真的太多了!
有兴趣的可以钻研下。
类的关系图附上,放大点击可以看下。
关于live555 项目客户端的解读楼主就不进行梳理了。大同小异,让我不解的是为什么服务器这么写~!这种写法原理上是无法实现高并发的操作的~!楼主愚见!由于本人水平不高希望读者多多评阅!