目录
-
项目要求:
该系统类似于网络收音机,提供多个频道的节目,客户端先接受频道列表,选择需要收听的频道,进行节目的收听。最多支持200个频道可供客户收听,200个频道可以同时收听。
-
项目分析:
-
c/s架构的 client / server
-
服务端主要推动组播系统的运行,客户端用于接收服务端推送的节目
-
服务端
- 基于IPV4, UDP(用户数据报协议 224~239)
- 支持多个频道同时收听,需要同一时间段内执行多个任务或处理多个事件,可以选择多进程并发,或者多线程并发(线程池)
- 所有频道的节目数据是需要存储的,可以选择存储在磁盘中,或者数据库。需要解析整个频道的目录
- 整体来说服务端以服务方式运行,建议使用守护进程
-
接口、模块细分
-
模块一 媒体库模块
- 音频文件的IO操作,可使用标准IO,或文件IO
- 获得频道目录,使用目录流的方式(opendir(3) / readdir(3) / closedir(3)),或 glob(3)
- 实现方案
- 抽象数据类型 struct mlib_st {};
- 获取频道列表 mlib_get_chn_list();
- 读取频道数据 mlib_read_chn_data();
-
模块二 并发服务器模块(线程池)
- 采用多线程资源竞争同步
- 多线程并发可以提高程序的响应速度和资源利用率。反之,多进程间的切换和通信开销较大,并发性能可能会受到一些限制。
- 采用多线程资源竞争同步
-
模块三 主模块
- 负责的是整体的调动
- 初始化线程池
- 初始化套接字
- 构建守护进程
- 调用媒体库模块,获取频道列表
- 将发送频道列表任务入队(发送频道列表的函数加入到线程池 )
- 将发送频道数据任务入队(有多少个有效频道(有描述+有数据),启动多少个发送频道数据函数)
- 负责的是整体的调动
-
隐含模块 流量控制模块
- 发送频道列表和发送频道数据,需要流控(客户端播放音频按照一定速率播放)
-
客户端
- 初始化套接字,绑定端口
- IP_ADD_MEMBERSHIP,加入多播组,从网络中接收数据
- 从接受的频道列表中选择频道,并播放接收到的音频mplayer
- 父进程读网路数据,写入管道
- 子进程读管道,由子进程运行mplayer
- dup2(pfd[0], 0);
- execl("/usr/bin/mplayer", "mplayer", "-", NULL)