—项目需求—
目前需要实现基于客户机和服务器模型的网络音频广/点播系统,本音频系统可以广泛应用在语音教室和公共广播等多种场所。
项目简介
服务端方面
登录模块:
通过I/O多路复用的epoll 来接受客户端的连接请求,并为每个连接进来的fd申请一个定时器,用来检测非活跃连接。读写操作等,然后在线程池中分配工作线程给fd进行业务逻辑处理。相当于异步I/O的Proactor框架。业务逻辑中就是与mysql数据库信息进行比对,来实现登录或者注册。用mycat中间件实现读写分离。
音乐电台模块:
将频道、音乐信息初始化,饿汉的单例模式。UDP在组播中进行传输音乐数据,发送端通过流量控制来控制传输速度。
客户端方面
通过QT绘制登陆系统以及音乐电台界面,QT中的线程来读取节目单以及音乐数据,采用mpg123音频解码器来进行音乐资源的解析。
原理
1.服务端初始化
2.服务端核心框架
3.客户端框架
部分展示
关键要点
epoll 线程池 流量控制 非活跃定时器 mysql读写分离 QT 单例模式 等。
存储
用户的账号和密码相关信息存储在mysql数据库当中,设计mysql的连接和增查。
音乐文件数据存储在当前ubuntu文件系统中,涉及到解析文件存储。
流量控制
无论是音频播放,还是视频播放,都会涉及到流量控制,流量控制即每秒播放多少个字节。如果没有流量控制,就会像 cat 命令一样,一下全显示出来,所以这是必不可少的。
网络套接字
从sevre端向PC端传送数据,需要用到网络套接字SOCKET
exec函数族
可以让一个进程摇身一变变成另一个进程
但是不能让当前进程直接变,否则它正在进行的工作就会前功尽弃。
解决办法:
fork当前进程,创建一个子进程,让子进程变成所需要的可执行的二进制程序
进程间通信
将子进程创建完毕,父子进程分工明确,父进程从sever端接收数据,并传给子进程处理,这里用到了进程间通信。
线程池实现各个音乐数据读取
通过线程池的方式实现音乐数据的读取。
守护进程
会脱离终端
信号
通过信号来退出服务器端,并完成一系列的析构
一. 什么是多播(组播)?为什么出现多播(组播)?
Server给局域网的交换机发送数据,无论连接到局域网的客户端想不想接收该数据,Server都会给客户端发送该数据。—>进而造成客户端上数据的拥塞—>因此引出了多播(组播):Server可以将数据包只发送给指定组内的客户端,而不发送给指定组外的客户端。
二. 组播地址
IP 多播通信必须依赖于 IP 多播地址,在 IPv4 中它是一个 D 类 IP 地址,范围从== 224.0.0.0 到 239.255.255.255==,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类
IP地址 | |
---|---|
224.0.0.0~224.0.0.255 | 局部链接多播地址:是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包 |
224.0.1.0~224.0.1.255 | 预留多播地址:公用组播地址,可用于Internet;使用前需要申请 |
224.0.2.0~238.255.255.255 | 预留多播地址:用户可用组播地址(临时组地址),全网范围内有效 |
239.0.0.0~239.255.255.255 | 本地管理组播地址,可供组织内部使用,类似于私有 IP 地址,不能用于 Internet,可限制多播范围 |
多播的实现:
int setsockopt( int sockfd, int level,int optname, const void *optval, socklen_t optlen );
网络连接状态排查
出现该问题,第一步进行网络状态排查,通常也是最有效的方法之一。进入Ctrl+Alt+T打开终端,输入以下命令,查看网络状态信息。
sudo vim /var/lib/NetworkManager/NetworkManager.state
可以看到,网络状态信息NetworkingEnabled=false,
不知道怎么就被搞成了false,要想修改成true,需要以下步骤:
关闭网络服务:sudo service network-manager stop
设置网络状态:sudo vim /var/lib/NetworkManager/NetworkManager.state,设置为true
打开网络服务:sudo service network-manager start
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 351134995@qq.com