中国风网站模板html,免费建官方网站,wordpress 搜索用户名,重庆做app开发的公司前面我们实现了TCP服务器和客户端的简单应用#xff0c;接下来我们实现一个基于TCP协议的应用协议#xff0c;那就是HTTP超文本传输协议。
1、HTTP协议简介
超文本传输协议#xff08;Hyper Text Transfer Protocol#xff09;#xff0c;简称HTTP#xff0c;是一种基于…前面我们实现了TCP服务器和客户端的简单应用接下来我们实现一个基于TCP协议的应用协议那就是HTTP超文本传输协议。
1、HTTP协议简介
超文本传输协议Hyper Text Transfer Protocol简称HTTP是一种基于TCP的应用层协议也是目前为止最为流行的应用层协议之一可以说HTTP协议是万维网的基石。
HTTP是一种客户端请求、服务器应答式的应用层传输协议也就是说服务器端是不可能主动向客户端发送数据的。在网络正常的情况下请求和响应都是一一对应的。而这个请求和响应也就是后端开发人员经常看到的Request和Response。
首先我们来看客户器端的请求HTTP请求报文由请求行、请求头、空白行以及请求体组成。其报文格式如下 我们来说一说请求行它由请求方法字段、URL字段和HTTP协议版本字段3个字段组成它们用空格分隔。需要理解的是请求方法HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT几种。先对常用的几种说明如下
GET方法意思是获取URL指定的资源这个请求方式是最简单的也是最常用的。使用GET 方法时可以将请求参数和对应的值附加在 URI 后面利用一个问号(“?”)将资源的URI和请求参数隔开参数之间使用与符号(“”)隔开因此传递参数长度也受到了限制而且与隐私相关的信息也直接暴露在URI中。比如/index.jsp?usernameholmofypassword123123HEAD方法与GET用法相同但没有响应体使用场合没有GET多。比如下载前使用HEAD发送请求通过ContentLength响应字段来了解网络资源的大小或者通过LastModified响应字段来判断本地缓存资源是否要更新。POST方法一般用提交信息或数据请求服务器进行处理例如提交表单或者上传文件。表单使用POST相对GET来说还是比较隐秘的而且GET的URL有长度限制而上传大文件就必须要使用POST了。OPTIONS方法该方法用于请求服务器告知其支持哪些其他的功能和方法。通过OPTIONS 方法可以询问服务器具体支持哪些方法或者服务器会使用什么样的方法来处理一些特殊资源。可以说这是一个探测性的方法客户端通过该方法可以在不访问服务器上实际资源的情况下就知道处理该资源的最优方式。这个选项在跨域HTTP请求的情况出现的比较多这里有一篇关于跨域请求的文章其中有一张图很好的解释了什么是跨域HTTP请求。
客户端发出HTTP请求服务端接收后会向客户端发送响应信息。所以接下来我们来看看服务器端的响应报文。HTTP响应报文由响应行、响应头、空白行以及响应体组成。其报文格式如下 在响应报文中非常重要的就是响应行其中响应行中最重要的就是HTTP的状态码。HTTP协议中状态码有三位数字组成第一位数字定义了响应的类别有以下五种
1XX信息提示。表示请求已被服务器接受但需要继续处理范围为100~101。2XX请求成功。服务器成功处理了请求。范围为200~206。3XX客户端重定向。重定向状态码用于告诉客户端浏览器它们访问的资源已被移动并告诉客户端新的资源位置。客户端收到重定向会重新对新资源发起请求。范围为300~305。4XX客户端信息错误。客户端可能发送了服务器无法处理的东西比如请求的格式错误或者请求了一个不存在的资源。范围为400~415。5XX服务器出错。客户端发送了有效的请求但是服务器自身出现错误比如Web程序运行出错。范围是500~505。
我们开发过程有一些状态码比较常见我们对其简单说明如下 2、 HTTP服务器端的设计
我们已经对基于RAW API的TCP应用有了了解。我们在实现TCP服务器的实验时就提到过对于更复杂的应用和应用层协议只是在功能上的差别从实现的结构及流程来说是完全一致的。所以对于实现HTTP服务器需要使用到的函数及整个操作流程我们就不再叙述了。重点说一说不同的地方。
首先HTTP服务器是基于TCP的所以其我们先将其当作TCP服务器来实现。需要注意的是HTTP协议有其专门的操作端口80。所以我们设计服务器时需要使用这个端口。
在这里我们设计一个简单的HTTP服务器当客户端连接到服务器之后如果收到的是html请求则返回一个我们预先设定好的网页。正常返回这个网页HTTP的功能就完成了HTTP服务器会主动断开与客户端的连接。
3、 TTP服务器实现
既然是基于TCP的HTTP服务器我们佷显然依然按照TCP服务器的结构来实现。我们依然将其划分为三个部分来实现。首先要实现的是HTTP服务器的初始化。
/* HTTP服务器初始化配置*/void Http_Server_Initialization(void)
{struct tcp_pcb *pcb NULL; /* 生成一个新的TCP控制块 */pcb tcp_new(); /* 控制块绑定到本地IP和对应端口 */tcp_bind(pcb, IP_ADDR_ANY, TCP_HTTP_SERVER_PORT); /* 服务器进入侦听状态 */pcb tcp_listen(pcb); /* 注册服务器accept回调函数 */tcp_accept(pcb, HttpServerAccept); }
从上面的代码不难看出与TCP服务器的初始化一样建立控制块为控制块绑定本地IP和端口服务器监听控制块同时注册接收处理回调函数。所以接下来就是实现接收处理回调函数。
/* HTTP接收回调函数客户端建立连接后本函数被调用 */
static err_t HttpServerAccept(void *arg, struct tcp_pcb *pcb, err_t err)
{/*注册HTTP服务器回调函数*/tcp_recv(pcb, HttpServerCallback);return ERR_OK;
}
客户端连接成功后就会调用接收处理回调函数。该函数为tcp_accept_fn类型注册到了监听控制块的accept字段。在这个函数中我们需要注册HTTP服务器处理函数。其功能就由这个函数决定。
/* HTTP服务器信息处理回调函数 */
static err_t HttpServerCallback(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
{char *data NULL;if (p ! NULL){ /* 更新接收窗口 */tcp_recved(pcb, p-tot_len);data p-payload;/* 如果是http请求返回html信息否则无响应 */if(p-len 3 data[0] G data[1] E data[2] T){tcp_write(pcb, htmlMessage, sizeof(htmlMessage), 1);}else{}pbuf_free(p);tcp_close(pcb);}else if (err ERR_OK){return tcp_close(pcb);}return ERR_OK;
}
这个HTTP服务器非常简单我们只是实现了GET方法。也就是说收到客户端的html请求后我们检测其要求如果是GET方法我们就返回预先设定好的网页否则无返回。然后关闭这一连接。如果我们想要实现更复杂的功能或者需要支持HTTP协议的其他方法只需要扩展这个函数就可以了。
4、 结论 HTTP协议是一种使用非常广泛的协议其基于TCP基础上运行所以在我们前面已经实现TCP服务器及客户端的情况下开发HTTP服务器应用就显得简单了。在这一篇我们基于LwIP实现了一个简单的HTTP服务器应用我们并对其进行了简单的测试虽然我们只是实现了GET方法但经测试设计是正确的。如果需要设计其他方法的HTTP应用只需在此基础上添加即可。
欢迎关注