|
============================================
|
项目总结:
|
1、服务端
|
网络通信:
|
tcp协议,长连接
|
粘包问题:tcp协议本身没有报文长度的字段
|
解决的话是在应用层加一个自定义的数据头,在数据头里面增加一个封包长度字段,按封包长度来进行收包解包即可
|
【也可以加一些特殊的标志位来分隔--标志位的风险是内容可能会包含标志位,导致解包出问题】
|
|
针对长连接的半开闭连接,使用心跳检测来去除无用的长连接,并且进行客户端的断线重连的保活
|
|
|
性能优化:由多线程升级为线程池
|
线程池:不会对线程频繁的创建和销毁
|
只是控制线程的使用,配合任务队列完成操作;
|
操作过程:
|
有个总的调度,负责判断任务队列中有没有任务以及线程队列中还有没有空闲线程
|
|
如果有任务来并且有空闲线程,就会将任务分发给空闲线程来执行
|
|
细节:
|
任务队列:
|
满的话,就是达到了任务能排的最大值
|
就需要抛一个满的异常或者使用条件变量来等待放入队列中;
|
|
线程队列:
|
线程数最小值、最大值的设定
|
最小值:保证常规的操作
|
最大值:可能最大的极限,在允许的范围内设定一个合理值
|
【一般从最小到最大之间,可以由并发量的增加来对应开辟更多数量的线程,减少也是一样的道理】
|
用了线程池之后,业务的操作由同步的方式切换到了异步的方式,性能也能得到进一步提升。
|
|
通信模型:
|
select模型:[轮询--按时间间隔每次从头到尾遍历]
|
基于数组存放套接字的轮询模型
|
数组长度有默认大小:windows-64,linux-1024
|
大小可以修改
|
量级:1000个左右[千级]
|
|
poll模型:
|
基于链表存放套接字的轮询模型
|
链表无长度限制
|
量级:10000个左右[万级]
|
|
epoll模型:
|
基于事件触发的一个poll模型,效率更高
|
使用回调的方式处理
|
量级:1000000个左右[百万级]
|
|
数据库封装:MySQL数据库的连接数量默认最大值100个
|
单例模式--多处地方共用同一个对象
|
优点:省内存
|
缺点:效率不够高
|
|
提升性能:连接池[类似线程池的操作]
|
连接池的核心是有一定数量的数据库连接
|
有任务来了,可以给一个空闲连接,来执行任务
|
|
日志封装:
|
单例模式
|
文件滚动--改名算法--用ID或者时间戳的方式改名
|
|
|
|
|
|
|
2、客户端
|
有界面,最容易碰到的问题是界面卡顿的问题
|
解决:将耗时业务放到子线程中去执行,这样就不会阻塞主线程里面的界面响应操作,从而解决卡顿问题
|
|
文件传输:断点续传
|
一般要在服务端专门弄个表来记录一下传输信息
|
当发生传输中断之后,就可以通过查询记录来确定断点处
|
再多比较已传内容断点之前的几个字节内容是否和原始文件的一致,一致则开始从断点处重传。
|
若记录找不到或已传文件丢失都需要从头开始传输。
|
|
超大文件的读取:按行读取,不能一下子全读进来,否则内存不够用
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|