项⽬1--博客管理系统--业务逻辑模块-(http服务器,)--httplib库的使⽤,处。
。。
我们的服务器对应多个客户端,如果多个客户端同时发起查询操作
如果每⼀个查询操作都会实例化⼀个TableBlog对象,新建⼀个mysql句柄
如果每⼀个查询操作都会实例化⼀个TableTag对象,使⽤同⼀个mysql句柄
讲解了stoi函数 看图
讲解了 mvc
数据管理模块:基于mysql操作封装类,对应数据库中的各个表,通过实例化的对象完成对数据库的访问操作。
业务逻辑模块:针对客户端的请求 提供业务处理能⼒
开始讲解业务逻辑模块
1、⽹络通信功能 (提供客户端与服务端的⽹络通信功能)
1、后台搭建http服务器;(主要是搭建服务器,使⽤了httplib的接⼝,也没有细化搭建,但是了解了httplib的实现)
2、客户端实际上就是浏览器(客户端不需要搭建 就是浏览器,根据模块点点点)
http服务器:
**是什么?**
1、采⽤http协议实现的服务, http协议只是⼀个应⽤层协议(⼀种数据格式),采⽤了http协议进⾏通信的进程可以被称之为http服务进程。
2、http是应⽤层协议,在传输层使⽤tcp协议
3、http服务器,就是⼀个tcp服务器,只是在应⽤层(应⽤程序界⾯),完成http协议格式的请求与响应的解析以及针对请求提供服务。
**如何搭建?**
1、搭建tcp服务端
2、等待客户的请求,解析请求,得到http协议格式中的各个要素(请求⽅法,url,pat路径以及查询字符串,头部字段,正⽂)
3、根据客户端的请求,完成业务处理后,组织http响应数据,进⾏响应。
http服务器我们并不从头开始搭建,借助于httplib库进⾏搭建
使⽤第三⽅库搭建框架,通常会⽐较简单,只要⽤接⼝就可以,但是⾯试,同通常会问使⽤库搭建服务器的时候,这个库是如何实现的,为什么不⾃⼰实现(不是不会⾃⼰实现,可以实现,但是为了效率,直接使⽤别⼈已经实现好的接⼝搭建,但是我们了解库的搭建流程)json 库不了解的原因是因为 他就是序列化反序列化,httplib⾥边⽐较复杂,所以需要了解
在git⾥边到cpp-httplib⽂件,然后到linux界⾯下去下载,并且打开cpp-gttplib只需要⾥边的htplib.h就可以了
打开httplib⽂件,⾥边的代码不断的在更新,使⽤这个⽂件,可以搭建服务器和客户端,都是可以的。
将cpp-httplib⽂件的httplib.h的⽂件 复制到example⽂件中,这时候相当于thhplib.h⽂件是⼀个我们⾃⼰的⽂件,在搭建服务器的时候可以直接加载头⽂件#include"httplib.h"
httplib服务器⽰例
#include “httplib.h”//因为在linux下 httplib.h被放在了运⾏⽂件中,所以将这个当作⾃⼰的头⽂件去使⽤
using namespace httplib;//使⽤httplib的命名空间
void helloworld(const Request& req, Response& res)
{
res.set_content("Hello World!","text/plain");
}
int main(void)
{
Server svr;//实例化⼀个server对象,使⽤上边的httplib的⽂件⾥边的命名
/
晚婚的婚假是多少天/svr.Get()--成员函数,--注册请求--业务处理路由关系--告诉服务器哪个请求对应使⽤哪个函数进⾏业务处理
//第⼀个参数:“/hi” ---url中的pat路径
//第⼆个参数,写helloworld函数就是为了讲解第⼆个参数,也是lambel表达式
//第⼆个参数,写helloworld函数就是为了讲解第⼆个参数,也是lambel表达式
//第⼆个参数其实就相当于是⼀个不同的处理函数第⼀个参数就是不同的请求
svr.Get("/hi",[](const Request& req, Response& res){
res.set_content("Hello World!","text/plain");
});
svr.Get("/hi", helloworld);这个与上边⼀样GET⼀样,如果有helloworld函数的话。。
///
svr.Get(R"(/numbers/(\d+))",[&](const Request& req, Response& res){
auto numbers = req.matches[1];
res.set_content(numbers,"text/plain");
});
svr.Get("/body-header-param",[](const Request& req, Response& res){
if(req.has_header("Content-Length")){
auto val = _header_value("Content-Length");
}
新鲜蚕豆的做法
if(req.has_param("key")){
auto val = _param_value("key");
}
res.set_content(req.body,"text/plain");
});
//
svr.Get("/stop",[&](const Request& req, Response& res){
svr.stop();
});
///
svr.listen("localhost",1234);//开始服务器监听
}
真正可以使⽤的代码
#include"httplib.h"
int main(void)
{
using namespace httplib;
Server svr;/
svr.Get("/hi",[](const Request& req, Response& res){
res.set_content("Hello World!","text/plain");
});
svr.Get(R"(/numbers/(\d+))",[&](const Request& req, Response& res){
auto numbers = req.matches[1];
res.set_content(numbers,"text/plain");
});
svr.Get("/body-header-param",[](const Request& req, Response& res){
if(req.has_header("Content-Length")){
auto val = _header_value("Content-Length");
}
if(req.has_param("key")){徐若瑄结婚
auto val = _param_value("key");
}
res.set_content(req.body,"text/plain");
});
svr.Get("/stop",[&](const Request& req, Response& res){
svr.stop();
});
北辙南辕人物关系图svr.listen("localhost",1234);//这⾥只是⽤了tcp服务器连接的⼀个listen接⼝,我们实现的时候还有很多,可以去看看前边写的tcp的连接那⼀块知识点}
运⾏了上边的服务器,记得关闭linux的防⽕墙,当作linux现在是⼀个服务器,./启动服务器,然后在浏览器当作客户端去访问服务器ip:port/hi
关闭防⽕墙。。
客户端访问⽰例
linux那块⾃动退出
httplib库的使⽤–总结(上边的代码)
1、实例化servre对象;
2、对server注册请求-业务处理路由(给不同的请求注册不同的处理函数)
3、开始监听处理
**注意1:**httplib内部接受到请求的时候,解析请求,根据不同的请求到不同的函数,执⾏这个函数进⾏业务处理,最终进⾏响应。**注意2:**httplib使⽤时,使⽤⾼版本的gcc进⾏编译,否则会运⾏时崩溃
如果你的服务器使⽤的是
张新成为什么叫本哥
云服务器:不要忘了,到控制台去开通端⼝
虚拟机:不要忘了关闭虚拟机的防⽕墙 sudo systemctl stop firewalld
以上是http的基本使⽤。。。
**
httplib的⼯作流程
**
httplib中主要的类 :Server,Client,Request,Response
1、实例化⼀个Server对象
2、注册请求–处理路由(给对应的请求设置对应的处理函数)
3、开始服务器监听
httplib处理流程
1、程序员先提前编写不同请求对应的处理函数 void(*handler)(Request&,Response&)
2、实例化Server对象(对象中包含两个关键信息:请求与处理函数映射表,线程池)
3、程序员⾃⼰根据不同请求以及业务处理,在Server对象中建⽴映射关系Sercver.Get()/.post()./Put()./Delete(). 这⾥服务器都搭建完了,会与客户端建⽴⼀个tcp的连接,然后使⽤服务器的监听接⼝进⾏监听来⾃客户端的请求。
4、搭建tcp服务器开始监听
//以上四步骤 上边的程序可以总结
//新连接是主线程去获取的,然后处理使⽤⼦线程去处理。
金婚 银婚5、有新连接到来,则将新连接抛⼊线程池中进⾏处理
6、线程池中线程处理流程:
1、接收http请求头部,进⾏解析,并且根据头部中的content-length接受正⽂,将解析到的各个元素
填充Request对象
2、根据请求⽅法+资源路径,在映射表中查对应请求的处理函数,到这个函数之后执⾏这个函数,传⼊请求信息
3、⾃⼰编写的处理函数中根据request中的请求信息,进⾏业务处理,处理完毕后填充Response对象。
4、处理函数执⾏完毕后,线程根据ResPOnse对象中的数据组织http响应,发送给客户端
5、如果是短链接则关闭套接字,处理完毕;如果是长连接,则等待下⼀条请求。