Linux项目:基于HTTP协议的自主web服务器

文章目录

          • 前言
          • 项目描述
          • 技术特点
          • 开发环境
          • 具体实现
          • HTTP CGI
          • 项目特点

前言

在学习了网络基础方面的知识后,想要将自己所学习的网络知识应用到实践中,因此,模拟实现一个基于http协议的小型web服务器

项目描述

采用B/S模型或者C/S模型(浏览器/服务器模型),编写支持中小型应用的http,理解常见互联网应用行为(从上网到关闭浏览器的所有操作)模拟实现了使用浏览器上网背后的一系列技术细节;

技术特点

网络编程(TCP/IP协议,socket流式套接字、http协议)、多线程技术、cgi技术、shell脚本、线程池技术引入

开发环境

centos 7、 vim/gcc/gdb +c(语言为C++);

具体实现
  • http协议的特点
    首先我们必须知道http协议的特点:
    (1)快速,简单,由于http服务器程序规模比较小,速度比较快;
    (2)灵活:http协议允许传输任意类型的数据对象,正在传输的资源类型统一使用Content-Type来标识;
    (3)无连接:每次连接只处理一个请求,服务器对请求响应之后,断开连接,采用这种方式可以节省传输时间;
    (4)无状态:每次只有新的请求来临才会产生新的响应,协议不会保留之前的请求和响应,这是为了更快的处理大量的事务,确保协议的可伸缩性;
  • URI、URL、URN
    URI指统一资源标识符,是用来唯一标识一个资源;URL指统一资源定位符,是一种具体的URI,不仅标识一个资源,还指明了如何定位这个资源;URN指统一资源命名,是通过名字来标识资源;URL和URN都是一种URI;
  • http请求与响应
    如图:
    Linux项目:基于HTTP协议的自主web服务器_第1张图片
    但是一般的请求和响应是这样的:
    请求:
    Linux项目:基于HTTP协议的自主web服务器_第2张图片
    响应:
    Linux项目:基于HTTP协议的自主web服务器_第3张图片
    一般请求和响应有很多种,一般我们主要使用到的请求方法是GET与POST方法,接下来介绍一下GET方法和POST方法的不同:
    GET是获取被URI标识的资源,POST是传输实体主体;
    而响应一般根据响应状态码(http返回给浏览器的状态码)来进行划分,响应状态码表示服务器HTTP响应状态的3位数字代码。通过状态码,就可以知道服务器端是否正确的处理的请求,如果不正确,是因为什么原因导致的(404)如图:
    Linux项目:基于HTTP协议的自主web服务器_第4张图片
    基本上我们的web服务器可以理解成一个通过http协议进行限制的TCP通信socket套接字编程时所做的服务器程序,给这个服务器程序加上http协议,让它发送的报文都是http封装的,因为有了http协议,这个服务器就可以解析浏览器发来的请求,并响应,为了使这个服务器程序更加的好用,我们会引入CGI模式,也就是cgi程序与web服务器之间的接口标准,是在cgi程序与web服务器之间传递信息的过程,为了理解cgi,我们先要理解GET方法和POST方法的区别,GET方法从浏览器传入参数时,是需要将参数跟在URI后面的,POST方法从浏览器传参数给http服务器时,是需要将参数放的请求正文的;
    GET方法:如果没有传参,http按照一般的方式进行,返回资源即可
    GET方法:如果有参数传入,http就需要按照CGI方式处理参数,并将执行结果(期望资源)返回给浏览器
    POST方法:一般都需要使用CGI方式来进行处理
HTTP CGI

为了让我们的服务器程序更加地方便和实用,我们采取了CGI技术,它是外部应用程序与web服务器之间的接口标准,是在CGI程序和web服务器之间传递信息的过程
注意:
一般服务器可能会同时被多个用户访问,大量的链接可能会让服务器的线程突然增加,因此,我们可以通过线程池来解决这个问题

项目特点

(1)支持客户端/服务器模式,客户端利用GET和POST方法来请求资源;
(2)简单快速:客户端向服务端发送请求服务时,只需要传递请求方法和路径;
(3)灵活:HTTP协议允许传输任意类型的数据对象,正在传输的类型由Content-Type来进行标记;
项目源码:https://github.com/wangbiy/project2/commit/41e73c74e9bea9190f46e3ec2da3091dc5b54ecf

你可能感兴趣的:(#,项目)