TinyHttp学习(一): 基础知识学习和该项目的需求
2018-02-22 21:00
197 查看
TinyHttp是一个非常棒的学习项目, 短短500行便实现了一个轻量级的HTTP服务器,对于我们学习网络编程和HTTP非常有帮助。
这里先提供一下学习该项目必备的基础知识,着重面向对HTTP和socket编程毫无概念的新手朋友们。
一、HTTP协议基础
1.HTTP消息格式
通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。
典型的HTTP请求格式包括 请求行,请求头,请求体三个部分。如下所示,其中\r\n只是我特意标出来的换行符,实际上并不显示。 POST/GET http://google.com HTTP/1.1\r\n Accept:*/*\r\n Pragma: no-cache\r\n Cache-Control: no-cache\r\n \r\n 【请求体】
其中第一行就是请求行, 其格式包括 请求方法、请求url地址和协版本。
第2-4行是请求头, 分别代表了4个头域。头域通常是Web服务器去使用的。
请求头后跟着一个空行, 接下来就是请求体。请求体没有固定格式, Web服务器通常不参与请求体的解析,由用户自己完成。
典型的HTTP响应格式包括 响应行,响应头,响应体三个部分。如下所示
HTTP/1.1 200 OK\r\nContent-Type: text/html \r\nServer: jdbhttpd/0.1.0\r\n
\r\n【响应体】第一行就是响应行, 响应成功就会回复200, 响应不成功会回复404等错误代号,
第2-3行就是响应头。 Content-Type指数据类型,一般为text类型,有时是一些图片或者app类型时,要修改一下。
一个空行之后,就是响应体。
2. HTTP响应过程
通常,先是由客户端(浏览器)发出HTTP请求
发出后与服务器建立一个TCP连接
服务器先判断请求方法是GET还是POST还是其他。
接着读取url,url代表了该请求要访问的文件或者接口。 url有时候可以为 url?query_string, 即中间隔一个问号,后面跟着一些请求参数。
接着再读取响应头,并根据每个响应头做出相应的措施。
请求体一般由用户处理。
二、网络编程基础
这里给出接下来TinyHttp会用到的所有函数,届时可以在这里进行比对,但不会太详细地去介绍,具体的请参阅《UNIX高级编程》和《UNIX网络编程》两本书
网络编程相关函数socket
bind
listen
getsockname
htons
ntohs
acceptIO以及多线程相关:fgets
recv
write
pipe
fork
dup
pthread_create
三、 CGI脚本
CGI代表Common Gateway Interface(通用网关界面),它使在网络服务器下运行外部分应用程序(或网关)成为可能。CGI-BIN 目录是存放CGI脚本的地方。这些脚本使WWW服务器和浏览器能运行外部程序,而无需启动另一个原因程序。
它是运行在Web服务器上的一个程序,并由来自于浏览者的输人触发。CGI是在HTTP服务器下运行外部程序(或网关)的一个接口,它能让网络用户访问远程系统上的使用类型程序,就好像他们在实际使用那些远程计算机一样。 CGI应用程序的工作原理是这样的:
1.浏览器通过HTML表单或超链接请求指上一个CGI应用程序的URL。
2.服务器收发到请求。
3.服务器执行指定所CGI应用程序。
4.CGI应用程序执行所需要的操作,通常是基于浏览者输人的内容。
5.CGI应用程序把结果格式化为网络服务器和浏览器能够理解的文档(通常是HTML网页)。
6.网络服务器把结果返回到浏览器中。
四、 TinyHttp的实现需求
先理解tinyhttp要做什么。这里的需求用于希望不直接借助源码,先自己用C语言写一遍的同学。实现需求:
1. 使用多线程服务器模型, 服务器时刻监听, 每当收到一个请求, 则新建一个线程来处理这个请求。
2. 从客户端读取消息时,每次读一行
从第一行中,判断出方法是GET还是POST
如果是GET,且没有url?qurey_string 形式,即没有携带请求参数时,且请求的文件是非执行文件, 则直接返回url中所对应的文件数据。 例如url为/lsx/data/blog.txt ,则找到该文件blog.txt, 并给客户端发送响应消息。 注意,响应消息要先发响应行,即200 OK, 再发响应头, 发几个重要的头部即可,不需要都发。 空行之后,再发送这个文件的数据即可。
如果Get带有请求参数,或者GET是可执行文件, 或者为POST,则一定会调用一个的处理脚本,来返回一串数据。我们需要做的就是调用那个处理脚本,然后将脚本所输出的内容(通常为标准输出,这时候我们需要重定向)发回到客户端(不要遗漏响应行和响应头)
3.加上响应的错误消息,例如文件不存在等错误返回。
fgetsdupforkpiperecvwrite
这里先提供一下学习该项目必备的基础知识,着重面向对HTTP和socket编程毫无概念的新手朋友们。
一、HTTP协议基础
1.HTTP消息格式
通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。
典型的HTTP请求格式包括 请求行,请求头,请求体三个部分。如下所示,其中\r\n只是我特意标出来的换行符,实际上并不显示。 POST/GET http://google.com HTTP/1.1\r\n Accept:*/*\r\n Pragma: no-cache\r\n Cache-Control: no-cache\r\n \r\n 【请求体】
其中第一行就是请求行, 其格式包括 请求方法、请求url地址和协版本。
第2-4行是请求头, 分别代表了4个头域。头域通常是Web服务器去使用的。
请求头后跟着一个空行, 接下来就是请求体。请求体没有固定格式, Web服务器通常不参与请求体的解析,由用户自己完成。
典型的HTTP响应格式包括 响应行,响应头,响应体三个部分。如下所示
HTTP/1.1 200 OK\r\nContent-Type: text/html \r\nServer: jdbhttpd/0.1.0\r\n
\r\n【响应体】第一行就是响应行, 响应成功就会回复200, 响应不成功会回复404等错误代号,
第2-3行就是响应头。 Content-Type指数据类型,一般为text类型,有时是一些图片或者app类型时,要修改一下。
一个空行之后,就是响应体。
2. HTTP响应过程
通常,先是由客户端(浏览器)发出HTTP请求
发出后与服务器建立一个TCP连接
服务器先判断请求方法是GET还是POST还是其他。
接着读取url,url代表了该请求要访问的文件或者接口。 url有时候可以为 url?query_string, 即中间隔一个问号,后面跟着一些请求参数。
接着再读取响应头,并根据每个响应头做出相应的措施。
请求体一般由用户处理。
二、网络编程基础
这里给出接下来TinyHttp会用到的所有函数,届时可以在这里进行比对,但不会太详细地去介绍,具体的请参阅《UNIX高级编程》和《UNIX网络编程》两本书
网络编程相关函数socket
bind
listen
getsockname
htons
ntohs
acceptIO以及多线程相关:fgets
recv
write
pipe
fork
dup
pthread_create
三、 CGI脚本
CGI代表Common Gateway Interface(通用网关界面),它使在网络服务器下运行外部分应用程序(或网关)成为可能。CGI-BIN 目录是存放CGI脚本的地方。这些脚本使WWW服务器和浏览器能运行外部程序,而无需启动另一个原因程序。
它是运行在Web服务器上的一个程序,并由来自于浏览者的输人触发。CGI是在HTTP服务器下运行外部程序(或网关)的一个接口,它能让网络用户访问远程系统上的使用类型程序,就好像他们在实际使用那些远程计算机一样。 CGI应用程序的工作原理是这样的:
1.浏览器通过HTML表单或超链接请求指上一个CGI应用程序的URL。
2.服务器收发到请求。
3.服务器执行指定所CGI应用程序。
4.CGI应用程序执行所需要的操作,通常是基于浏览者输人的内容。
5.CGI应用程序把结果格式化为网络服务器和浏览器能够理解的文档(通常是HTML网页)。
6.网络服务器把结果返回到浏览器中。
四、 TinyHttp的实现需求
先理解tinyhttp要做什么。这里的需求用于希望不直接借助源码,先自己用C语言写一遍的同学。实现需求:
1. 使用多线程服务器模型, 服务器时刻监听, 每当收到一个请求, 则新建一个线程来处理这个请求。
2. 从客户端读取消息时,每次读一行
从第一行中,判断出方法是GET还是POST
如果是GET,且没有url?qurey_string 形式,即没有携带请求参数时,且请求的文件是非执行文件, 则直接返回url中所对应的文件数据。 例如url为/lsx/data/blog.txt ,则找到该文件blog.txt, 并给客户端发送响应消息。 注意,响应消息要先发响应行,即200 OK, 再发响应头, 发几个重要的头部即可,不需要都发。 空行之后,再发送这个文件的数据即可。
如果Get带有请求参数,或者GET是可执行文件, 或者为POST,则一定会调用一个的处理脚本,来返回一串数据。我们需要做的就是调用那个处理脚本,然后将脚本所输出的内容(通常为标准输出,这时候我们需要重定向)发回到客户端(不要遗漏响应行和响应头)
3.加上响应的错误消息,例如文件不存在等错误返回。
fgetsdupforkpiperecvwrite
相关文章推荐
- HTTP学习一:HTTP基础知识
- android开发学习---基础知识学习、如何导入已有项目和开发一个电话拨号器
- 学习Spring必学的Java基础知识(9)----HTTP报文(系列全)
- 程序必备基础知识学习:通信协议——Http、TCP、UDP
- 关于Http一些基础知识的学习
- 关于Http一些基础知识的学习
- 学习Spring必学的Java基础知识(9)----HTTP报文(系列全)
- 学习C++动态链接库基础知识 (主要关于QT项目)PART2
- Node.js学习--基础知识(9)--HTTP客户端
- http协议基础,学习搜索引擎必备知识
- java在线聊天项目 实现基本聊天功能后补充的其他功能详细需求分析 及所需要掌握的Java知识基础 SWT的激活方法,swt开发包下载,及破解激活码
- 主题:学习Spring必学的Java基础知识(9)----HTTP报文(系列全)
- JavaEE进阶知识学习-----SpringBoot基础知识-1-项目初始化知识
- HTTP学习一:HTTP基础知识
- 学习C++动态链接库基础 4000 知识 (主要关于QT项目)
- HTTP项目1.0 -- HTTP协议基础知识
- 学习Spring必学的Java基础知识(9)----HTTP报文(系列全)
- 学习Spring必学的Java基础知识(7)----事务基础知识
- ASP.NET基础之HttpContext学习
- CSS学习.0(基础知识,一般格式,class,id