在线答题系统(小型HTTP服务器)

代码:https://github.com/1732543811/Http
首先我们了解一下,当我们在浏览器中输入了一个网址,发生了什么第一步 浏览器查找该域名的 IP 地址DNS查找过程为:浏览器缓存->系统缓存->路由器缓存->ISP DNS缓存->递归                         搜索递归搜索过程为:从根域名服务器到顶级域名服务器到你查询的域名服务                           器。第二步 浏览器根据解析得到的IP地址向 web 服务器发送一个 HTTP 请求第三步 服务器收到请求并进行处理第四步 服务器返回一个响应第五步 浏览器对该响应进行解码,渲染显示。第六步 页面显示完成后,浏览器发送异步请求。  第七步 整个过程结束之后,浏览器关闭TCP连接

服务器实现的基本思路:

        1、http协议(应用层)是基于TCP(传输层)协议,因此,实现web服务器的第一步至少要能实现两个主机不同进程之间的TCP通信。 2、接下来的部分就是比较主要的处理逻辑了,当服务器收到请求后,首先应该分析请求方法(因为web服务器是要支持cgi的,但请求方法不同处理cgi也不同,这里我们只处理GET和POST方法)。 3、当方法确定后,应该拿到请求的URL,这一步是为了我们后边能处理GET和POST方法的cgi(GET和POST的参数位置不同,GET的参数在URL中,POST的参数在请求正文中) 4、判断资源是否存在,如果存在,判断这个资源是一个目录、普通文件还是一个可执行程序。之前几步我们已经提取到URL以及参数。GET方法:如果没有参数,就直接将请求的资源返回(即进入非cgi模式运行);否则,进入cgi模式内部运行;只要是POST方法就需要支持cgi:直接进入cgi函数内部运行。

请求跟响应:

请求

1.请求行    请求方法 请求URL HTTP协议以及版本(POST /user.html HTTP/1.1)
2.请求报头  accept:请求能接受的类型referer:请求从哪个网页跳转过来的UA:浏览器版本Content-type;数据类型(有效载荷的类型)Connection:Keep-Alive ----支持长连接(短连接:请求响应随机断开连接)
3.空行
4.请求正文 请求的是资源

响应

1.状态行   协议版本 状态吗以及描述 (HTTP /1.1 200 OK)
2.响应头
3.空行
4.响应体

为什么要写线程池:(线程之间切换是要花成本的,客户感觉是服务器越来越慢,容易被大量请求搞崩溃,线程增多,cpu承受压力越多,越来越慢)

  线程池的好处1.预先创建一批线程;2.这些线程的总数是有上限的;(无数个请求被封装成一个个的任务,放到线程池中的任务队列里,线程池中的活跃线程把任务一个个消掉就行了,更稳定一定)多个资源同时访问一个资源要保证线程安全,加个锁线程池在内部创建了5个线程,加http本身的话就是6个线程,每个应用线程都会去执行我们的threadRoutine进入循环后,检测任务队列是不是为空,为空就idle,1个线程是获取新连接的,剩下的5个事处理idle的,当有一个任务来的时候,前段server是把这个任务accept下来,构建一个task任务 ,push到任务队列里,然后single函数唤醒后端的一个线程,后端线程开始了cai非cgi请求,读取报头,分析报头,响应报头

cgi的运行机制:

    首先服务器要从浏览器上读取参数,然后需要fork出一个子进程进行cgi部分的处理,父进程通过环境变量的方式将参数转交给子进程,子进程运行完成后,将结果交给父进程,父进程再将数据输出给浏览器。在这个过程中可以将父进程看作一个所谓的中间量,只进行了参数的转交,因此可以将子进程的输入输出文件描述符进行重定向,即子进程直接与浏览器“联系”。父进程:1.创建两个管道,并关闭相应的文件描述符2.POST方法:继续读取数据,直到读完post的参数部分GET方法:直接从子进程读取结果3.将数据和方法全部交给子进程后等待子进程的结果子进程:1.关闭管道的文件描述符2.对标准输入和输出进行重定向3.通过环境变量传递参数4.进行exec程序替换

错误处理

如果出现客户端错误,需要改变响应的消息报头的格式,即改变状态码,状态码描述,以及返回的页面。例如当请求的资源不存在时,服务器需要返回给浏览器一个默认的404页面,告诉客户请求的资源不存在。

具体一些细节

1.建立连接:创建socket()1.创建CreateSocket()2.绑定BindSocket()3.建立监听Listen()4.接收新的套接字,accept()5.收发数据6.关闭套接字创建线程接收数据帮助我们完成任务
pthread()
设置线程注意线程分离(避免程序运行时只是单线程)2.接收:HTTP格式:以行为单位陈列出的(基于传输层的TCP)请求:请求行:请求方法//资源路径?参数 HTTP协议版本请求报头空行正文:响应:响应行响应报头:响应状态//状态码空行正文:服务器首先拿到请求:对行进行读取报头与正文之间有一个空行,从这里可以将报头与正文进行区分拿到行的数据   请求行           request_line请求报文          request_header空行                 blank正文                 request_text服务端拿到请求后首先进行解析:一行一行进行解析使用stringstream()函数对请求行进行数据分解分解请求行:methoduri      HTTP协议版 请求方法:method:(一般用于获取资源)GET方法通过URL传参POST:(一般用于传输资源(更强调将数据提交))POST方法通过正文传参对请求资源路径进行解析解析请求资源路径中是否存在这个资源请求的资源是否可执行请求的资源是否可以读判断请求是否带参(针对GET请求)已经确定为GET方法针对url格式 “路径?参数”只要碰到问号就能够获得参数解析路径:判断路径是否合法:合法:判断文件是否是可执行文件若是可执行程序并且允许获得结果--交给CGI将程序执行然后CGI将结果返回获取文件的属性:文件所属人文件所属组文件创建时间文件修改时间stat 文件名 查看文件的属性 采用系统调用函数获取到文件属性stat()判断资源请求路径是都只是一个目录若不是目录则根据文件属性判断文件状况读取请求报头:(读到空行位置结束)(包括空行一起读上来了)请求报头记住Content-Length:  112;Content-Type:  html;分解请求报头:将key:value分别取出判断请求方法看是否需要继续读取若是GET方法到这里可能就结束了若是POST方法到这里可能需要再次往下面读读取正文:在请求报头中有一个属性Content-Length可以知道正文的长度Content-Length可以从文件的属性中知道正文读完之后:就要进行构建响应响应的格式:状态行响应报文空行正文解读状态行:状态码构建响应是注意采用的方式:C   GI   (HTTP将运行程序的任务交给CGI,CGI运行的结果交给HTPP显示)非CGI   ()

在线答题系统(小型HTTP服务器)相关推荐

  1. 毕业设计(论文)-c++小型ftp服务器系统【毕业论文】.doc,毕业设计(论文)-C++小型FTP服务器系统.doc...

    毕业设计(论文)-C小型FTP服务器系统 Suihua University Graduation Paper A Small FTP System Based on the VC++ Student ...

  2. 后台服务器和安卓系统,在线答题系统(服务端,客户端包括web和android)、( 一)...

    最近在做练习,练习的内容就是做一个在线答题系统,主要内容包括后台开发,前台展示,前台又包括了web端和android端,现在将写的系统分享出来. 先放上后台的成果图 科目管理.png 题目和选项管理. ...

  3. 服务器系统宏碁,Acer AC100:不可小看的超小型桌面服务器

    现如今,服务器的种类越来越丰富.虽然种类繁多的服务器"乱花渐欲迷人眼",但精明的用户心里自有一把标尺:实用性.安全性,以及应用灵活性.本期,小编就和大家一起来看看来自Acer的AC ...

  4. 小型ASP服务器|简洁asp服务器

    小ASP Web2005服务器 一套强大简洁 的ASPWEB服务器, 应用这个软件的您完整可以遗弃体积宏大的WINNT,WIN2000服务器系统 及漏洞 百出的IIS了.现在你可以在任何一个系统 上调 ...

  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. 水库湖泊水雨情监测系统 小型水库雨水情自动测报

    平升电子的水库湖泊水雨情监测系统/小型水库雨水情自动测报适用于水利管理部门远程监测库水位.降雨量.现场图像/视频等.系统自动采集.报送,支持多用户并发请求,可实现对数据.图像/视频的快速调用.系统可总 ...

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

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

  9. 百度同步盘+系统备份实现服务器文件在线自动备份

    做好文件备份很重要,服务器通常会因为各种原因崩溃或出问题.如果服务器上的文件没有做好备份的工作,一旦服务器出问题,那么将会带来很大的麻烦.下面是广州网站建设一直用的,觉得很方便又好用的服务器在线备份方 ...

  10. win合适做服务器的系统,win系统做云服务器

    win系统做云服务器 内容精选 换一换 本节介绍如何查看云服务器的mac地址.云服务器的mac地址不支持修改.登录Linux云服务器.执行以下命令,查看云服务器的mac地址.ifconfig查看MAC ...

最新文章

  1. pythonappium环境搭建_python appium环境搭建
  2. c语言学习加强营(一):switch分支
  3. linux shell下除了某个文件外的其他文件全部删除的命令
  4. 代码创建listview android,android ListView 示例4 使用 SimpleAdapter 创建 ListView
  5. python编写代码运用递归画图形_python数据结构与算法 22 递归图形
  6. 第五章 基于时序差分和Q学习的无模型预测与控制-强化学习理论学习与代码实现(强化学习导论第二版)
  7. C语言实现走迷宫小游戏
  8. JXTA中定义自己的成员服务
  9. 流畅的python mobi 百度云_流畅的python【中文版】mobi下载
  10. 一款实用工具:免费短信验证码SDK
  11. Java六种异常处理的陋习
  12. 1.1.15. Passive Aggressive Algorithms(被动攻击算法)
  13. 微信公众号文章素材收集网站大盘点
  14. 分门别类刷leetcode——动态规划(C++实现)
  15. 微信小程序和PWA对比分析
  16. 操作系统——精髓与设计原理(第九版)
  17. excel 的选择性粘贴
  18. 【python趣味小代码】为你女(男)神打造专属素描照,hhhhhh
  19. 分段线性函数线性化的Yalmip实现
  20. 华硕主板安装Ubuntu双系统

热门文章

  1. 快速指数运算:平方-乘算法
  2. Towards a Theory of Accountability and Audit
  3. 笔记本连接老式显示器(VGA线+HDMI接口)
  4. 如何培养一个人:从育儿谈起
  5. 如何装计算机网络驱动,网卡驱动怎么安装,手把手教你电脑网卡驱动怎么安装...
  6. python模拟实现QQ邮箱登录
  7. JavaScript验证邮箱格式是否正确
  8. VISTA、Win7激活administrator用户
  9. 转自登峰之群:晓军教材(一)
  10. R语言——(四)、数据读入与预处理