微型http服务器

一、HTTP协议的主要特点

  1. 支持客户/服务器模式
  2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。
  3. 灵活:HTPP允许传输任意类型的的数据对象。
  4. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  5. 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

二、HTTP协议详解之URL篇

HTTP ( 超文本传输协议 ) 是一个介于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式。
HTTP URL ( URL是一种特殊类型的URI,包含用于查找某个资源的足够的信息 ) 的格式如下:
http://host[":"port][abs_path]
http 表示要通过HTPP协议来定位网络资源;
host 表示合法的Internet主机域或者IP地址;
port 指定一个端口号,为空则使用缺省端口80;
abs_path 指定请求资源的URI;如果URL没有给出abs_path,那么当它作为请求的URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮助我们完成;

三、HTTP协议详解之请求篇

HTTP请求由三部分组成,分别是:请求行、消息报头,请求正文。
1、请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:
Method Requerst-URI HTTP-Version CRLF
其中 Method 表示请求方法;
Request-URI 是一个统一资源标识符;
CRLF 表示回车和换行(除了结尾的CRLF外,不允许出现单独的CR或LF字符);
请求方法如下:
GET  请求获取Request-URI所标识的资源
POST 在Request-URI 所表示的资源后附加的新的数据

四、HTPP协议详解之响应篇

在接收和解释请求消息后,服务器返回一个HTTP响应消息。HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文。
状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
 其中,HTTP-Version 表示服务器HTTP协议版本;Status-Code 表示服务器发回的响应状态代码;Reason-Phrase 表示服务器HTTP协议的版本;Reason-Phrase 表示状态代码的文本描述。
 状态代码由三位数字组成 ,第一个数字定义了响应的类别,且有五种可能取值:
 1XX:指示信息--表示请求已接收,继续处理
 2XX:成功--表示请求已被成功接收、理解、接受
 3XX:重定向--完成请求必须进行更进一步的操作
 4XX:客户端错误--请求有语法错误或请求无法实现
 5XX:服务器段错误--服务器未能实现合法的请求
 常见状态代码、状态描述、说明:
 200 OK                            客户端请求成功
 400 Bad Request         客户端请求有语法错误,不能被服务器所理解
 401 Unauthorized           请求未经授权,这个状态必须和 WWW-Authenticate 报头域一起使用
 403 Forbidden                 服务器收到请求,但是拒绝提供服务
 404 Not Found                请求资源不存在
 500 Internal Server Error 服务器发生不可预期的错误
 503 Server Unavailable    服务器当前不能处理客户端的请求,一段时间后可能恢复正常

五、HTTP协议详解之消息报头篇

HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由状态行、消息报头、空行、消息正文组成

这里写图片描述

六、HTTP项目

项目流程图
这里写图片描述
这里写图片描述
这里写图片描述

CGI编程
CGI:通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口。通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。
1.POST方法
如果采用POST方法,那么客户端来的用户数据将存放在CGI进程的标准输入中,同时将用户数据的长度赋予环境变量中的CONTENT_LENGTH。客户端用POST方式发送数据有一个相应的MIME类型(通用Internet邮件扩充服务:Multi-purpose Internet Mail Extensions)。目前,MIME类型一般是:application/x-wwww-form-urlencoded,该类型表示数据来自HTML表单。该类型记录在环境变量CONTENT_TYPE中,CGI程序应该检查该变量的值。
2.GET方法
在该方法下,CGI程序无法直接从服务器的标准输入中获取数据,因为服务器把它从标
准输入接收到得数据编码到环境变量QUERY_STRING(或PATH_INFO)。
GET与POST的区别:采用GET方法提交HTML表单数据的时候,客户机将把这些数
据附加到由ACTION标记命名的URL的末尾,用一个包括把经过URL编码后的信息与CGI程序的名字分开:http://www.mycorp.com/hello.html?name=hgq$id=1,QUERY_STRING的值为name=hgq&id=1
有些程序员不愿意采用GET方法,因为在他们看来,把动态信息附加在URL的末尾有
违URL的出发点:URL作为一种标准用语,一般是用作网络资源的唯一定位标示。
 
环境变量是一个保存用户信息的内存区。当客户端的用户通过浏览器发出CGI请求时,服务器就寻找本地的相应CGI程序并执行它。在执行CGI程序的同时,服务器把该用户的信息保存到环境变量里。接下来,CGI程序的执行流程是这样的:查询与该CGI程序进程相应的环境变量:第一步是request_method,如果是POST,就从环境变量的len,然后到该进程相应的标准输入取出len长的数据。如果是GET,则用户数据就在环境变量的QUERY_STRING里。
3.POST与GET的区别
       以 GET方式接收的数据是有长度限制,而用 POST方式接收的数据是没有长度限制的。并且,以 GET方式发送数据,可以通过 URL的形式来发送,但 POST方式发送的数据必须要通过 Form才到发送。

项目源码


版权声明:本文为qq_36345632原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。