自主小型Web服务器实现——TinyHttp
目录
一.功能
二.技术特点
三.主要框架
四.CGI技术
五.流程
六.具体实现细节
6.1 套接字部分
6.2 线程池部分
6.3 协议处理部分(主要部分)
七.测试结果
一.功能
实现一个自主开发的小型web服务器。可以解决用户的基本网页请求。主要是静态网页的返回和动态网页的返回。
二.技术特点
- 网络编程(http协议,TCP/IP协议,socket流式套接字)
- 多线程技术(线程池)
- CGI技术
三.主要框架
使用http协议结合socke流式套接字,cgi技术,多线程技术和部分系统编程,完成的一款小型Web服务器。
四.CGI技术
CGI技术全称Common Gateway Interface(通用网关接口)。
作用是能够让服务器方便的调用外部程序(CGI程序)。CGI本身是一套协议和规范,体现在数据传输上。原则上只要拥有读写文件功能的编程语言都可以用来编写CGI程序。注意区分CGI技术和CGI程序,是两个不同的概念。CGI技术是一个标准,CGI程序,是处理数据的程序。
服务器确认需要使用调用CGI程序来处理数据时,为了Web服务器的安全,需要创建子进程,运用进程替换,替换到CGI程序执行。由于数据在Web服务器进程中,需要将参数传递给子进程。并且子进程需要将处理结果发送给web服务器进程。
由于程序替换不会替换文件描述符和环境变量,环境变量具有全局属性。
在父进程传递参数时,可以通过设置环境变量来进程参数的传递或者通过管道来进程参数的传递。如果通过管道进行参数的传递,替换进程对于管道的文件描述符不明确,我们可以在未替换进程前,将管道重定向到标准输入,替换进程从标准输入里读管道数据即可。
在替换进程传递结果时,只能通过管道将结果发送给父进程。需要创建进程前,创建管道,由于替换进程对于管道文件描述符不明确,需要在为替换进程前,将管道重定向到标准输出,替换进程只需要将处理完的数据写道标准输出即可。父进程从管道读数据即可。
总结:
web服务器进程向CGI程序发送数据有两种方式环境变量和管道。如果使用管道,需要将管道重定向到标准输入。
CGI程序向父进程发送数据只能通过管道,需要将管道重定向到标准输出。将数据写道标准输出中,父进程从管道拿数据。
注意:如果web服务器使用管道传递数据给CGI进程,由于管道时单向的,需要创建两个进程。
在HTTP协议中,GET或者POST请求方法有参数,需要使用CGI技术出来参数后返回。
五.流程
web服务器从网络套接字中收到用户请求。解析请求,分析请求是GET请求方法还是POST请求方法。
如果是GET请求方法,如果带参,运用CGI技术处理完参数,再构建响应返回。不带参直接构建响应返回。
如果是POST请求方法,如果协议中有请求正文,运用CGI技术处理,再构建响应返回。
如果访问的是资源是一个可执行程序,也需要运用CGI技术处理。
六.具体实现细节
项目主要包括
- HttpServer.hpp:web服务器的起点
- ThreadPool.hpp:多线程部分
- Sock.hpp:关于网络套接字部分
- Protocol.hpp:关于协议处理部分,获得请求,分析请求,制作响应,发送响应。
- Util.hpp:与协议无关的处理,比如:字符串转整形
- Log.hpp:日志
6.1 套接字部分
可以从网络中获得请求。
建立套接字,设置端口复用(setsockopt),绑定套接字(端口号和IP地址),监听套接字(listen),等待连接请求的到来。
6.2 线程池部分
一次性创建多个线程,避免来一个请求再创建一个线程的开销。使用线程池中的线程来处理请求,构建响应返回,并且将线程池设成单例模式(懒汉模式),只有一个线程池对象。
注意:线程处理的任务时一个个请求。
6.3 协议处理部分(主要部分)
http协议格式
①获得请求并细分:
根据HTTP协议请求包括四个部分请求行,请求报头,空行,请求正文。其中请求行包括请求方法,url,协议版本。请求报头是一些属性信息,以KV形式呈现。报头和正文以空行分隔。
收到请求,需要将其拆分成4个部分,请求行,请求报头,空行,请求正文。每个部分还需要细分。由于协议是以行为单位,所以按行读取,由于不同客户端制作的协议行分隔符可能不同(\r,\n,\r\n)。所以按字符读取,我们获取后 统一以\n结尾。
请求行:
读取一行,将请求行细分为请求方法,url,协议版本。以空格分隔。
请求报头:
循环按行读取,读取到空行结束。保存在map中,方便查找。
空行:
在读取报头时可以一起读上来。
请求正文:
GET方法没有正文,不需要读取正文。
POST方法,如果在报头中有一个属性Content_length表示正文字节数。如果大于0,需要读取正文,按字符读取,读取content_length个字符。
②分析请求
介绍url:
主要处理GET和POST方法,其它方法直接构建响应返回,状态码为404。
分析请求主要是获得请求资源的路径和参数。请求资源的路径在url中。注意:在web的目录中都会有一个text.html文件。
请求的资源从web根目录开始。GET和POST方式传参方式不同,GET方法参数在url中,POST在正文中
如果是GET方法:
参数和路径的分隔符是"?",这个"?"是唯一的,如果查询"?"会被urlencode转化。如果不存在"?"说明没有参数。存在"?"在url中找到"?"前面为路径,后面为参数。
如果是POST方法:
路径直接是url,有请求正文的话,参数是请求正文。
其中GET有参数,POST有参数需要使用CGI技术来处理参数。
判断请求资源:
请求资源不存在,直接构建响应返回,状态码为404。
如果是一个目录,说明访问下的该目录下的text.html文件。
如果是可执行程序,需要使用cgi技术处理。
如果是一个普通网页文件,说明直接就是访问该文件内容。
③构建响应返回
以行为单位。根据HTTP协议响应包括四个部分状态行,响应报头,空行,响应正文。其中状态行包括协议版本,状态码,状态码描述。响应报头是一些属性信息,以KV形式呈现。报头和正文以空行分隔。
- 构建响应行:
直接构建,需要通过不同状态码,对应不同描述。发送响应行。构建协议版本,状态码(可以响应的为200,不可以响应的404),状态码描述。最后以/r/n结尾。
- 构建响应报头:
需要添加一些属性content_type等。发送响应报头。
- 构建空行:
发送空行
- 构建响应正文:发送响应正文。构建响应正文需要区分是否使用CGI技术。
1.不需要用到CGI技术:
GET无参,POST无参,普通网页文件,直接打开文件,将文件内容发送过去。
2.使用CGI技术:
创建子进程,使用进程替换,替换到CGI程序。替换进程主要替换子进程的数据和代码。通过环境变量和进程间通信技术来传数据。
参数传递:参数POST方式参数用管道发送给替换进程,替换进程不知道管道文件描述符,需要将管道重定向到标准输入。替换进程从标准输入那参数。GET方式,通过环境变量发送给替换进程。请求方式通过环境变量发送给替换进程(通过请求方式来确定从哪里获取参数),正文大小通过环境变量发送给替换进程(POST需要读取正文)。
结果传递:替换进程不清楚管道文件描述符,重定向管道到标准输出,将处理的结果从标准输出传递给父进程。
web服务器将处理的结果发送到网络中。
最后需要将Web服务器守护进程化。
守护进程是特殊子进程,与终端无关。调用daemon系统调用。
gitee源码:CODE: 保存学习重要代码
七.测试结果
- GET不带参数
- GET带参
- POST带参
自主小型Web服务器实现——TinyHttp相关推荐
- 自主开发的小型Web服务器
自主开发的小型Web服务器 1. 技术特点 2. 具体步骤 3. CGI技术 4. Mysql连接 5. Gitee原码链接 6. 参考Blog 1. 技术特点 网络编程(http协议,TCP/IP协 ...
- 项目--基于http协议的小型web服务器
在我们对网络的学习过程中,会接触到网络编程,我们在网络中可以深刻认识到服务器与客户端的交互,当我们输入网址时背后发生的一系列后端操作,为了加深我们对网络部分的学习,我们找到了一个开源项目TinyWeb ...
- mysql 花生壳 2003_基于HTTP协议实现的小型web服务器的方法
这篇文章主要介绍了基于HTTP协议实现的小型web服务器的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 我们先了解一下这个 ...
- Linux下小型web服务器boa的使用
boa是一个小型的web服务器,可以用于多种平台,在嵌入式中比较常见. boa的官方网站为www.boa.org,可以在上面下载最新版本的boa:boa-0.94.13.tar.gz (不过这个&qu ...
- 安卓手机安装php服务器地址,利用Android手机搭建小型Web服务器
使用背景 手头有一个项目的网页需要跨终端展示,考虑到一些数据的保密性,不能放在公网上的虚拟主机上面,所以需要在局域网中搭建一个小型的Web服务器 现在电子设备更新换代的很快,手里有一些闲置的安卓设备使 ...
- 基于HTTP实现的小型web服务器
主要流程为:服务器获得请求–>响应并处理请求–>返回结果. 完整的HTTP过渡到TCP实现客户端与服务器的交互过程 1.当客户端执行网络请求的时候,从url中解析出url的主机名,并将主机 ...
- 基于HTTP协议实现的小型web服务器
我们先了解一下这个项目最终能达到的一个目标,然后以这个来进行项目的分析: 1.实现最基本的HTTP/1.0版本的web服务器,客户端能够使用GET.POST方法请求资源 2.服务器将客户请求的资源以h ...
- 小型web服务器的编写
此代码实现了web服务器的基本功能编写 首先我们来在来介绍一下web服务器** tomcat现在较为流行的服务器 这里来一个小插曲,想必大家都使用过tomcat,在使用tomcat的时候,我们首先要编 ...
- Tiny server:小型Web服务器
一.背景 csapp的网络编程粗略的介绍了关于网络编程的一些知识,在最后的一节主要就实现了一个小型的Webserver.这个server名叫Tiny,它是一个小型的可是功能齐全的Webserver.在 ...
最新文章
- Java基础班学习笔记(15)GUI图形界面编程
- happy card 完全背包dp
- tensorflow+numpy 深度学习相关函数(持续更新)
- mysql cannot connect_【IT专家】mysql远程访问cannot connect(10038) 问题解决的过程
- 专属海报小程序_剑3泡泡 | 小程序给你一份专属的账号海报!
- Jfinal集成Spring
- Linux 0.11内核分析03:系统调用
- html设置桌面背景win7,怎么让电脑桌面背景动起来 win7设置动态背景桌面的方法...
- 智能DNS - 免费智能DNS解析服务-迄今为止最好用的智能DNS
- conv2d() received an invalid combination of arguments问题解决
- java闪烁的星空_PS制作出闪烁的星空gif动态图
- 开启大功率无线充电新时代
- 超火的炫酷告白源码(HTML+CSS),前端表白源码,520表白,七夕情人节专属源码--文字开场白+相册旋转+浪漫3D樱花樱花雨
- 网页中LRC歌词同步显示
- Mock服务的理解和搭建
- C语言怎么把单词拆成字母,如何用C语言切出汉语单词和英语单词混合字符串
- Django企业it资产管理系统
- 常见的5种网站页面布局方式及特点分析
- android中 textview.setVisibility(View.VISIBLE)失效问题
- 10名IB学生获得满分,新加坡环球印度国际学校成为一匹黑马