epoll+线程池 简单TCP并发文件服务器
epoll部分代码在libevent的源码上修改的
线程池部分参考 https://www.cnblogs.com/yangang92/p/5485868.html
操作过程:将所有文件拷贝到Linux目录下(改源码中存放文件的路径),
make命令进行编译,打开(多个)终端./server运行服务器端,./client运行客户端,
然后在客户端下输入操作:
update xxx.txt(这个文件要在CLI_PATH路径下)或者 download xxx.txt(这个文件要在服务器PATH的路径下)
大致的思路:开两个线程池,一个用于任务列表维护,一个用于任务列表处理
服务器端用epoll监听是否有连接或者已连接的fd有无数据(一个type表示客户端要进行的操作)发来,
接收到type后,根据type的值确定客户端要进行的操作(上传或者下载)
然后对任务列表维护线程池发放任务(将数据包放到任务列表里),再对任务列表处理线程池发放任务(对任务列表的数据包进行处理)
源码地址:https://github.com/KronosCzj/epollDocServer
不足的地方:1.任务列表维护线程池里的线程每次要对客户端的整个操作(比如说要把客户端发来的一个文件全部读完)执行完才结束,导致并发量决定于线程池线程数目,
当用户数目远大于线程池数目时,超过线程池线程数目后面的用户的操作要等前面用户的操作结束才能开始,
应该将列表维护线程池里的线程的任务的粒度缩小到一个包的粒度,轮流处理用户的操作,然后放入任务列表
2.这个版本只是一个大致功能的实现,对一些细节并没有实现,比如上传服务器已有的文件会继续再这个文件末尾追加等等
3.太大的文件传输不了,客户端只是简单的send和recv,应该用同样的多线程维护一个任务列表来进行数据的传输的
4.代码封包解包部分重复较多
//文章由笔者原创,记录和分享自己的学习历程,转载请注明出处