主要流程为:服务器获得请求–>响应并处理请求–>返回结果。

完整的HTTP过渡到TCP实现客户端与服务器的交互过程
1.当客户端执行网络请求的时候,从url中解析出url的主机名,并将主机地址转换成ip
2.从url解析出服务器的所用端口号
3.客户端用TCP连接服务器
4.连接成功后 获取输出流,将数据以报文的形式传递给服务器
5.当服务器接收到数据之后,进行判断和解析码,并回应一条响应报文
6.客户端从输入流中获取报文,然后进行解析
7.关闭网络连接

HTTP的特点

1、支持客户端/服务器的模式
2、简单快捷 客户向服务器发送请求服务时,只需要传送请求方法和路径,每种方法规定了客户与服务器联系的类型的不同,由于HTTP协议简单,使得HTTP服务器的规模小,因此通信速度很快.
3、灵活  允许传送各种类型的数据,数据类型用Content-Type标记
4、无连接:限制每次连接只处理一个请求,服务器处理完客户的请求,收到客户的应答后,随即断开连接,这种方式节省传输时间,请求应答机制会断开
5、无状态  HTTP协议是无状态的协议,即对事务处理没有记忆功能

关于URL

即统一资源定位符,每个网页都对应一个URL地址(俗称网址),具有全球唯一性。它包含的信息指出文件的位置以及浏览器应该怎么处理它。 一个完整的URL包括协议类型、主机类型、路径和文件名。 
http协议的URL格式: http: //host[:port][abs_path] ,http表示使用http协议来进行资源定位;host是主机域名;port是端口号,一般有默认的;abs_path代表资源的路径。 
这里我主要介绍项目中涉及的URL的两种格式—URL带参数和不带参数的。

HTTP的请求与响应格式


响应报头中的状态码和状态码描述,例如:当请求的资源不存在时,会收到“404 NotFound”的页面,404就是状态码,“NotFound”就是状态码描述,即请求的文件不存在。

1.实现支持GET和POST方法的小型http服务器
GET方法:如果GET方法只是简单的请求一份资源,而不传递参数的话则由服务器直接将资源返回即可。如果GET方法的url中带有参数的话,则就要使用CGI模式进行处理。 
POST方法:POST方法要使用CGI模式进行处理,POST的参数在消息中文中出现。
使用GET方法使用的是带参数的url,传递的参数会使用?连接在资源后面POST方法使用的是不带参数的url 它的参数是通过http请求正文传递给服务器的,http的请求和响应模式

响应报头中的状态码和状态码描述,举个例子,当请求的资源不存在的时,会收到"404 NotFound"的页面,404就是状态码,

"NotFound"就是状态码描述,既请求的文件不存在

状态码表示响应类型

1×× 保留

2×× 表示请求成功地接收

3×× 为完成请求客户需进一步细化请求

4×× 客户错误

5×× 服务器错误

响应头的信息包括:服务程序名,通知客户请求的URL需要认证,请求的资源何时能使用

HTTP服务器实现框架

1.面向链接:http协议是基于TCP通信协议,因此实现web服务器的第一步至少要能实现两个主机不同进程之间的TCP通信,并且需要解决高并发问题所以这里推荐使用多线程服务器来构建,每次创建出来一个新线程出来的时候将线程分离,然后让这个新线程去处理这个请求.
2.分析出请求行: 当服务器接收到请求后,首先知道的是HTTP服务器版本号,和请求方法。web服务器是要支持cgi模式: 请求的方法不同,cgi可能也不同,我们实现的知识比较简单单的处理GET和POST方法
3.判断cgi模式
//    1)当我们判断出来是GET请求时候,并且url中没有参数的话,就用非CGI模式,非CGI模式处理//起来比较简单,首先解析出来请求路径,判断是不是合法资源,如果是就直接返回这个资源。
//    2)当是CGI模式处理请求的时候,我们要fork一个子进程,对子进程exec替换CGI程序,这个
//过程中使用pipe进行父子进程之间的通信。所有需要的参数在exec之前,都将这些参数导出为环境变//量,就算exec的话,子进程还是能够通过环境变量获取所需的参数。
4.响应客户端:此时我们已经知道了方法以及是否为cgi模式,然后开始读取URL,这里有一个细节非cgi模式 请求参数会跟在url当中,如果cgi模式的话,参数在消息正文中,然后我们读取到路径,判断路径当中资源是否存在,如果存在判断这个资源是一个目录,普通文件还是一个可执行程序

这里分情况分析
    1)如果是cgi模式,直接进入cgi内部运行;只要是POST方法就需要支持cgi,直接进入cgi函数内部运行.
    2)如果是非cgi模式时一定是GET方法并且没有参数,此时进入wwwroot()函数内部即可,该函数会将所请求的资源以html的格式返回给浏览器.

接下来是解释运行cgi模式,首先服务器要从浏览器读取参数,然后创建出来一个子进程去执行cgi部分的可执行资源,父进程通过环境变量的方式传递给子进程,子进程运行完成之后呢,将结果交给父进程,父进程再将数据输出给浏览器. 所以父进程在这个例子当中就向是一个中介,只进行参数和结果的转交实际上并不会执行任何资源,因此将子进程的输入输出文件描述符重定向,就可以让子进程直接与浏览器"联系".

父进程做的事情

  1. 1.创建两个管道,并关闭相应的文件描述符
  2. 2.POST方法:继续读取数据,直到读完POST的参数部分GET方法:直接从子进程读取结果
  3. 3.将数据和方法全部交给子进程后等待子进程的结果

子进程做的事情

  1. 1.关闭管道适当的文件描述符
  2. 2.对标准输入输出进行重定向
  3. 3.通过环境变量传递参数
  4. 4.进行exec程序替换

一次完整的http请求的流程

项目文件

目录: 
python:爬取小说和招聘信息的代码

sql_connect:存放mysql需要的lib库   连接mysql程序文件
wwwroot:web服务器工作的根目录,包含各种资源页面(例如默认的index.html页面,差错处理的404页面),以及执行cgi的可执行程序

文件:

makefile:编译整个项目
httpd.h:服务器的方法声明 
httpd.c:方法实现 
main.c:服务器的主逻辑

数据库中的操作
没有索引的时候会进行整个表的扫描
添加索引 索引会形成一颗二叉树  利用二分查找的方法。

遇到的问题:
1.运行cgi后不能显示在页面上,便尝试着写一个简单的CGI程序看自己的CGI是否真的能跑完,结果CGI没有问题,后来尝试用telnet工具模拟一次http,看看是否真的收到了网页回复,后来分析结果,对比之后发现返回的东西不能显示,之后给html加了一些p标签,便可以显示出来。
2. 经常会出现类似于:undefined reference to `sql_connecter::~sql_connecter()'的问题,文件编译的路径不对。
3.调用数据库的数据显示到html文件中出现乱码的问题,最初以为自己编码格式有问题,后来发现是数据库编码格式和浏览器的编码格式不一样,数据库使用utf8编码方式,浏览器是GB2312,后来浏览器使用utf8编码格式,能够正常显示。

4.代码中会需要int *和 void*的转换,用到C++强制转换形如  int*  data = reinterpret_cast<int*>(arg);

5.本地环回测试ok,Linux下的浏览器测试也可以,但不能接外部的浏览器访问(没有设置桥接模式) 在外部浏览器测试的话千万别忘记关闭防火墙

6.运行程序时会提醒挺行下载页面,因为在响应报头有问题中。而浏览器对于不能识别或解析的实体,都会提醒用户下载。

基于HTTP实现的小型web服务器相关推荐

  1. 项目--基于http协议的小型web服务器

    在我们对网络的学习过程中,会接触到网络编程,我们在网络中可以深刻认识到服务器与客户端的交互,当我们输入网址时背后发生的一系列后端操作,为了加深我们对网络部分的学习,我们找到了一个开源项目TinyWeb ...

  2. mysql 花生壳 2003_基于HTTP协议实现的小型web服务器的方法

    这篇文章主要介绍了基于HTTP协议实现的小型web服务器的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 我们先了解一下这个 ...

  3. 基于epoll实现简单的web服务器

    1. 简介 epoll 是 Linux 平台下特有的一种 I/O 复用模型实现,于 2002 年在 Linux kernel 2.5.44 中被引入.在 epoll 之前,Unix/Linux 平台下 ...

  4. arm Linux 低成本方案,参赛作品《低成本基于ARM+Linux平台搭建web服务器的物联网学习板》...

    [报名阶段需要填写的内容] 1. 参赛者姓名(必填项): 王徕泽 2. 单位或学校名称(选填项): 徕泽电子工作室 3. 当前职务或职称(选填项): 室长 4. 参赛作品的名字(必填项): 低成本基于 ...

  5. 自主开发的小型Web服务器

    自主开发的小型Web服务器 1. 技术特点 2. 具体步骤 3. CGI技术 4. Mysql连接 5. Gitee原码链接 6. 参考Blog 1. 技术特点 网络编程(http协议,TCP/IP协 ...

  6. 自主小型Web服务器实现——TinyHttp

    目录 一.功能 二.技术特点 三.主要框架 四.CGI技术 五.流程 六.具体实现细节 6.1 套接字部分 6.2 线程池部分 6.3 协议处理部分(主要部分) 七.测试结果 一.功能 实现一个自主开 ...

  7. 基于Docker和Golang搭建Web服务器

    1 场景描述 基于centos7的docker镜像搭建golang开发环境 在docker容器内,使用golang实现一个Web服务器 启动docker容器,并在容器内启动Web服务器 我购买了一个最 ...

  8. 基于HTTP协议实现的小型web服务器

    我们先了解一下这个项目最终能达到的一个目标,然后以这个来进行项目的分析: 1.实现最基本的HTTP/1.0版本的web服务器,客户端能够使用GET.POST方法请求资源 2.服务器将客户请求的资源以h ...

  9. 安卓手机安装php服务器地址,利用Android手机搭建小型Web服务器

    使用背景 手头有一个项目的网页需要跨终端展示,考虑到一些数据的保密性,不能放在公网上的虚拟主机上面,所以需要在局域网中搭建一个小型的Web服务器 现在电子设备更新换代的很快,手里有一些闲置的安卓设备使 ...

最新文章

  1. ionic模版引擎及循环
  2. 【机器学习入门笔记0:OpenCV+TensorFlow学习内容(目录)】20190122
  3. 浅拷贝 python_python中什么是浅拷贝
  4. orbeon form 的配置介绍
  5. 评分9.3,你想要的那本书,来了!
  6. Spring Cloud Config 规范 1
  7. 怎么才能升级成鸿蒙系统,怎么能升级成鸿蒙系统
  8. 创建win10介质进度为0_win10介质创建工具(media creation tool)下载
  9. Google 作恶!99.9% 的 Android 手机 App 都在窃取隐私
  10. 【WP8】Uri关联启动第三方App
  11. c# LINQ 使用
  12. GPS坐标转换(一)-基础知识
  13. 获取图片的十六进制颜色码(keynote/ppt取色器)
  14. 手写数字图像识别-SVM算法投票法实现多分类
  15. Canonical Coin Systems
  16. Appium 关于 swipe 滑动时间控件选择时间问题,swipe 滑动没效果,用 TouchAction代替
  17. uvm_objection/uvm_objection_events/test_done_objection/callbacks_objection/objection_callback
  18. 硬件艺术家Cauchy吉林省机器人大赛智能无人仿真车竞速比赛赛后总结
  19. 4 款超级好用的终端文件管理器
  20. FCN网络(Fully Convolutional Networks for Semantic Segmentation)

热门文章

  1. secureCRT思科路由器交换机专用脚本
  2. xshell7-free/for-home-school
  3. python怎么暂停运行_如何暂停长时间运行的循环?
  4. freeMarker读取布尔值,布尔值判断
  5. xlucar-需求文档-移库
  6. 数学分析教程史济怀练习16.1
  7. office 365无法登录
  8. java calendar 下个月_使用Java中的Calendar类增加一个月
  9. Carbide UI designer
  10. 通过url地址批量打包zip下载文件