轻松分享------基于HTTP的文件共享系统

文章目录

  • 项目名称
  • 项目简绍
    • 开发环境
    • 使用技术
  • 模块简绍
  • 项目源码
  • 项目流程图
  • 遇到的问题
      • 问题1
      • 问题2
      • 问题3
      • 问题4
  • 总结

项目名称

轻松分享

项目简绍

设计实现http服务端程序,能够提供浏览器客户端进行文件的上传,下载,浏览功能

开发环境

Linux 服务器 , g++ 编译器 , vim编辑器 , gdb 调试器 , make工具

使用技术

  1. 线程池/多线程/多进程
  2. Tcp/HTTP
  3. Epoll模型

模块简绍

  1. 搭建TCP服务器, 接收客户端连接请求,建立连接
class TcpSocket {
	private:
		int _sockfd;
	public:
		bool SocketInit();
		bool Accept(TcpSocket &sock);
		bool RecvPeek(std::string &buf);
		bool Recv(std::string &buf, int len);
}
  1. 基于多路转接模型进行事件总监控, 若有事件到来则抛入线程池
Class Epoll {
	private:
		int _epfd;
	public:
		bool EpollInit();
		bool EpollAdd(TcpSocket &sock);
		bool EpollDel(TcpSocket &sock);
		bool EpollWait(std::vector &list, int timeout = 3000);
}
  1. 实现线程池及任务类
typedef void (*TaskHandler_t)(int data);
class ThreadTask {
	private:
		int _data;
		TaskHandler_t _handler;
	public:
		void TaskAdd(int data, TaskHandler_t handler);
		void TaskRun();
}

class ThreadPool {
	private:
		std::queue _queue;
		int _max_queue;
		pthread_mutex_t _mutex;
		pthread_cond_t _cond_pro;
		pthread_cond_t _cond_con;
	private:
		int _max_thread;
		static void *thr_start(void *arg);
	public:
		ThreadPool(int max_queue, int max_thread);
		bool ThreadInit();
		bool TaskPush(ThreadTask &task);
}
  1. 实现HTTP解析类
//HTTP请求类, 解析HTTP的请求 , 将解析结果放入实例化对象中
class HttpRequest {
	public:
		std::string _method;
		std::string _path;
		std::unordered_map _param;
		std::unordered_map _headers;
		std::string _body;
	private:
		bool RecvHeader(std::string header);
		bool FirstLineParse(std::string &line);
		bool PathIsLegal();
	public:
		int  RequestParse(TcpSocket &sock);
}
//HTTP响应类
class HttpResponse {
	public:
		int _status;
		std::unordered_map _headers;
		std::string _body;
	private:
		std::string GetDesc();
	public:
		bool ErrorResponse();
		bool NormalResponse(TcpSocket &sock);
}
  1. Server类
class Server
{
	private:
		Tcpsocket lst_sock;
		Epoll epoll;
		ThreadPool poll;
	public:
		static void ThreadHandler(int data){
		TcpSocket sock;
		sock.SetFd(data)	;
		HttpRequest req;
		int status = req.RequestParse(sock);
		if(status != 200)
		{
			rsp.status = status;
			rsp.ErrorProcess(); }
		HttpResponse rsp;
		HttpProcess(req, rsp);
		rsp.NormalProcess(sock);
}
		bool HttpProcess(HttpReaquest &req , HttpResponse &rsp);
		

项目源码

源码

项目流程图

轻松分享------基于HTTP的文件共享系统_第1张图片

遇到的问题

问题1

  • 在进行解析客户端请求时, 对返回的数据进行处理时,时常出错

问题2

  • 交互端界面的构造, Html是一个我没怎么接触的语言, 所以我自己在网上套用了模板

问题3

  • 在实现断点续传功能时, 时常出错, 自己查询了大量资料才得以成功

问题4

  • 应对各类请求时的分别处理也是在写项目时遇到的头痛问题

总结

本项目就是一个实现http服务器, 然后用这个服务器来存储文件, 提供下载,上传功能, 通过这个项目, 我感觉自身的知识掌握还不牢固, 知识面比较狭窄, 需要巩固学习的东西还有很多, 希望自己今后多多加油~~

你可能感兴趣的:(轻松分享------基于HTTP的文件共享系统)