0


[项目][WebServer][整体框架设计]详细讲解

目录


0.框架 && 前言

  • 程序main()函数如下voidUsage(std::string proc){ std::cout <<"Usage:\n\t"<< proc <<" Port"<< std::endl;}intmain(int argc,char*argv[]){if(argc !=2){Usage(argv[0]);exit(4);} std::unique_ptr<HttpServer>httpServer(newHttpServer(atoi(argv[1]))); httpServer->Init(); httpServer->Loop();return0;}
  • 本项目将分模块设计,主要包含以下模块
  • 注意:本篇只放函数声明

1.TcpServer类

1.功能

  • 主要负责底层的TCP通信
  • 将其设计为单例模式,作为一个组件,置入HTTPServer中

2.类设计

staticconstuint16_t PORT =8090;staticconstint BACKLOG =128;// 单例 -- 饿汉模式classTcpServer{public:static TcpServer*GetInstance(uint16_t port = PORT){}voidInit(){}voidSocket(){}voidBind(){}voidListen(){}intSock(){}~TcpServer(){}private:TcpServer(uint16_t port):_port(port),_listenSock(-1){}TcpServer(const TcpServer&)=delete;private:uint16_t _port;int _listenSock;static TcpServer* svr;};

TcpServer* TcpServer::svr =nullptr;

2.HttpServer类

1.功能

  • 主要负责HTTP协议的通信
  • 其中主要包括以下模块 - TcpServer- ThreadPool- TaskQueue

2.类设计

classHttpServer{public:HttpServer(int port = PORT):_port(port),_stop(false){}voidInit(){}voidLoop(int threadNum = THREAD_POOL_NUM){}private:uint16_t _port;bool _stop;};

3.Request类 && Response类

1.功能

  • Request类负责存储接收到的请求及解析结果
  • ReSponse类用来构建响应

2.Request类设计

structHttpRequest{
    std::string request_line;
    std::vector<std::string> request_header;
    std::string blank;
    std::string request_body;// 解析结果
    std::string method;
    std::string uri;
    std::string version;
    std::unordered_map<std::string, std::string> headerMap;
    size_t content_length;
    std::string path;
    std::string suffix;
    std::string arg;bool cgi;HttpRequest():content_length(0),cgi(false){}};

3.Response类设计

structHttpResponse{
    std::string status_line;
    std::vector<std::string> response_header;
    std::string blank;
    std::string response_body;int status_code;int fd;int fSize;HttpResponse():status_code(OK),fd(-1),blank(LINE_END){}};

4.EndPoint类

1.功能

  • 负责两端业务处理,主要包括以下功能 - 读取请求、分析请求、构建响应、IO通信- 该类为本项目主要设计方向

2.类设计

classEndPoint{public:EndPoint(int sock):_sock(sock),_stop(false){}~EndPoint(){}voidRecvRequest(){}voidBuildResponse(){}voidSendResponse(){}boolIsStop(){}private:boolRecvRequestLine(){}boolRecvRequestHeader(){}voidParseRequestLine(){}voidParseRequestHeader(){}boolIsRecvRequestBody(){}boolRecvRequestBody(){}intProcessNonCgi(){}intProcessCgi(){}voidBuildResponseHelper(){}voidBuildOKResponse(){}voidHandlerError(std::string page){}private:int _sock;bool _stop;
    HttpRequest _request;
    HttpResponse _response;};

5.Task类

1.功能

  • 将HTTP请求构建成一个任务,以便ThreadPool管理任务队列,一定程度上和ThreadPool一起缓解了服务器压力

2.类设计

classTask{public:voidProcessOn(){}Task(){}Task(int sock):_sock(sock){}~Task(){}private:int _sock;
    CallBack _handler;// 设置回调};

6.ThreadPool类

1.功能

  • 线程池,分配任务给各线程,使其处理请求
  • 主要解决问题: - 大量链接过来导致服务器内部进程或者线程暴增,进而导致服务器效率严重降低或者挂掉- 节省链接请求到来时,创建线程的时间成本 - 提前创建好了一批线程,来任务时处理任务,没有任务时,让线程休眠- 让服务器的效率在一个恒定的稳定区间内 - 线程个数不增多,CPU调度成本基本不变

2.类设计

staticconstint THREAD_POOL_NUM =10;// 单例模式classThreadPool{public:static ThreadPool *GetInstance(int num = THREAD_POOL_NUM){}staticvoid*ThreadRoutine(void*args){}boolInit(){}voidPush(const Task& task)// in{}voidPop(Task& task)// out{}voidThreadWait(){}voidThreadWakeUp(){}boolTaskQueueIsEmpty(){}voidLock(){}voidUnlock(){}boolIsStop(){}~ThreadPool(){}private:ThreadPool(int num = THREAD_POOL_NUM):_num(num),_stop(false){}ThreadPool(const ThreadPool &)=delete;private:int _num;bool _stop;
    std::queue<Task> _taskQueue;
    pthread_mutex_t _mtx;
    pthread_cond_t _cond;static ThreadPool *_tp;};

ThreadPool* ThreadPool::_tp =nullptr;


本文转载自: https://blog.csdn.net/qq_37281656/article/details/142110218
版权归原作者 DieSnowK 所有, 如有侵权,请联系我们删除。

“[项目][WebServer][整体框架设计]详细讲解”的评论:

还没有评论