概述
TinyHttp是一个非常棒的学习项目, 短短500行便实现了一个轻量级的HTTP服务器,对于我们学习网络编程和HTTP非常有帮助。
这里先提供一下学习该项目必备的基础知识,着重面向对HTTP和socket编程毫无概念的新手朋友们。
一、HTTP协议基础
1.HTTP消息格式
【请求体】
其中第一行就是请求行, 其格式包括 请求方法、请求url地址和协版本。
第2-4行是请求头, 分别代表了4个头域。头域通常是Web服务器去使用的。
请求头后跟着一个空行, 接下来就是请求体。请求体没有固定格式, Web服务器通常不参与请求体的解析,由用户自己完成。
典型的HTTP响应格式包括 响应行,响应头,响应体三个部分。如下所示
第一行就是响应行, 响应成功就会回复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
accept
IO以及多线程相关:
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的实现需求
实现需求:
1. 使用多线程服务器模型, 服务器时刻监听, 每当收到一个请求, 则新建一个线程来处理这个请求。
2. 从客户端读取消息时,每次读一行
从第一行中,判断出方法是GET还是POST
如果是GET,且没有url?qurey_string 形式,即没有携带请求参数时,且请求的文件是非执行文件, 则直接返回url中所对应的文件数据。 例如url为/lsx/data/blog.txt ,则找到该文件blog.txt, 并给客户端发送响应消息。 注意,响应消息要先发响应行,即200 OK, 再发响应头, 发几个重要的头部即可,不需要都发。 空行之后,再发送这个文件的数据即可。
如果Get带有请求参数,或者GET是可执行文件, 或者为POST,则一定会调用一个的处理脚本,来返回一串数据。我们需要做的就是调用那个处理脚本,然后将脚本所输出的内容(通常为标准输出,这时候我们需要重定向)发回到客户端(不要遗漏响应行和响应头)
3.加上响应的错误消息,例如文件不存在等错误返回。
最后
以上就是幸福海燕为你收集整理的TinyHttp学习(一): 基础知识学习和该项目的需求的全部内容,希望文章能够帮你解决TinyHttp学习(一): 基础知识学习和该项目的需求所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复