【网络编程·应用层】一文详解http协议(超文本传输协议)

您所在的位置:网站首页 超文本传输协议所需要的软件有哪些 【网络编程·应用层】一文详解http协议(超文本传输协议)

【网络编程·应用层】一文详解http协议(超文本传输协议)

2024-07-05 15:35:55| 来源: 网络整理| 查看: 265

需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云-->阿里云-->华为云0) { respHeader+="Content-Length: "; respHeader+=std::to_string(req._size); respHeader+="\r\n"; } respHeader+="Location: https://www.csdn.net/\r\n"; 3、http常见的响应报头

HTTP协议常见的响应报头包括:

Content-Type:指定响应体的MIME类型,例如text/html表示HTML文本,image/jpeg表示JPEG图片等。Content-Length:指定响应体的长度,单位为字节。Cache-Control:指定缓存控制策略,例如no-cache表示不缓存,max-age=3600表示缓存1小时等。Expires:指定响应过期时间,通常与Cache-Control一起使用。Last-Modified:指定资源的最后修改时间,用于协商缓存。ETag:指定资源的唯一标识符,用于协商缓存。Location:搭配3XX状态码使用,指定重定向的目标URL。Set-Cookie:指定响应中的Cookie信息。Server:指定服务器软件的名称和版本号。X-Powered-By:指定服务器使用的编程语言和框架。 三、http协议客户端和服务器的通信过程

        以个人云服务器作服务器,浏览器作客户端,服务器打印客户端请求如图:

        这个http请求可以看到请求的设备信息,如果在手机端浏览器搜索“微信下载”,浏览器将会返回手机版的微信下载网页,若在电脑浏览器搜索,将会返回电脑版的微信下载网页。

        以个人云服务器作服务器,浏览器作客户端,服务器的响应格式:

        Content-Type: text/html\r\n用于指示所传输的数据是HTML格式的文本。注意响应报头位置不要打成test了,这些都是设定好的,如果输错了,浏览器请求服务器时,会变成下载html文件!同样的,图片的响应报头写错了,当客户端请求图片时,同样会变成下载逻辑。

1、如何保证请求和响应被应用层完整的读取了?

1、可以读取完整的一行

2、while循环读取行,将所有的请求行和请求报头全部读完,直到遇到空行

3、我们可以保证把请求行和请求报头读完,报头中有Content-Length:XXX(正文长度)

4、通过Content-Length所示的长度,读取对应长度的正文即可。

        一个用户看到的网页结果,可能由多个资源组合而成,所以要获取一张完整的网页效果,浏览器会发起多次http请求。所以需要根据客户端的请求信息,在服务器设置好不同的状态行和响应报头。

2、请求和响应如何做到序列化和反序列化

1、http不用关注json等序列化和反序列化工具,直接发送即可。服务器解析客户端的请求,获取其中的信息填充至响应缓冲区。服务器通过响应报头的方式返回请求的参数,在响应正文中返回请求的资源。

2、对于正文部分,如果需要的话,可以设计自定义序列化与反序列化方案。

3、客户端和服务器通信的全过程  void HandlerHttp(int sock) { //1、读取完整的http请求 char buffer[4096]; HttpRequest req; HttpResponse resp; size_t n=recv(sock,buffer,sizeof(buffer)-1,0);//读取套接字中的内容 if(n>0) { buffer[n]=0;//添加'\0' req._inBuffer=buffer;//获得序列化请求 //2、对客户端请求进行反序列化 //从客户端请求中解析获得请求行(请求方法、请求url、http版本)、请求资源的后缀、请求资源的大小 req.Parse();//对请求进行解析 //3、回调_func方法,由http请求获得http响应 _func(req,resp) //4、对http响应resp进行序列化 _func(req,resp); //funcs[req._path](req,resp); send(sock,resp._outBuffer.c_str(),resp._outBuffer.size(),0);//5、send发送 } }

步骤2反序列化:解析请求行,从url中获取请求的资源路径并计算资源的大小等。

void Parse()//从客户端请求中解析获得请求行(请求方法、请求url、http版本)、请求资源的后缀、请求资源的大小 { //1、从请求结构体中的_inbuffer中拿到请求行(第一行),分隔符\r\n std::string line=Util::getOneLine(_inBuffer,sep); if(line.empty()){return;} //2、从请求行中获取三个字段:请求方法、请求url、请求版本 //std::cout_httpVersion;//以空格为分割读取其中的字段 //2.1如果是GET方法,需要对_url进行额外处理 ///search?name=jiang&pwd=123通过?对GET方法进行左右分离(POST本来就是分离的没有问号) //左边是PATH,右边是_parm //3、添加web默认路径 _path=defaultRoot;//客户端所有请求路径前都会被加上./wwwroot前导目录字符串 _path+=_url;//如果客户端请求a/b/c.html,则会请求./wwwroot/a/b/c.html if(_path[_path.size()-1]=='/')//如果请求的是web根目录(./wwwroot/),就让它访问设定好的默认首页的路径(./wwwroot/index.html) { _path+=homePage; } //4、获取path对应的资源后缀 //./wwwroot/index.html //./wwwroot/test/a.html //./wwwroot/test/b.html //./wwwroot/image/dog.jpg auto pos=_path.rfind("."); if(pos==std::string::npos){_suffix=".html";}//实在找不到,先给个html else{_suffix=_path.substr(pos);} //5、得到响应正文的大小(客户端请求资源的大小) struct stat st; int n=stat(_path.c_str(),&st); if(0==n) { _size=st.st_size; } else{_size=-1;} }

步骤3、4,由客户端请求转换为客户端响应(设置一下不同响应方法的状态行、响应报头、响应正文等信息,这里的响应正文是html和图片)

bool Get(const HttpRequest& req,HttpResponse& resp) { // if(req._path=="test.py") // { // //建立进程间通信,pipe // //fork创建子进程,execl("/bin/python",test.py)进行进程程序替换 // //父进程,将req._parm通过管道写给某些后端语言,例如py、java、php等 // //.... // return true; // } // if(req._path=="/search") // { // //如果PATH是"/search",可以在这里写具体的C++方法,提供相应的服务 // //.... // return true; // } //打印客户端的请求的一些信息 std::cout


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭