TinyWebServer
===============
Linux下C++轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的服务器.
* 使用 **线程池 + 非阻塞socket + epoll(ET和LT均实现) + 事件处理(Reactor和Proactor均实现)** 的并发模型
* 使用**状态机**解析HTTP请求报文,支持解析**GET和POST**请求
* 访问服务器数据库实现web端用户**注册、登录**功能,可以请求服务器**图片和视频文件**
* 实现**同步/异步日志系统**,记录服务器运行状态
* 经Webbench压力测试可以实现**上万的并发连接**数据交换
目录
-----
| [概述](#概述) | [框架](#框架) | [Demo演示](#Demo演示) | [压力测试](#压力测试) |[更新日志](#更新日志) |[源码下载](#源码下载) | [快速运行](#快速运行) | [个性化运行](#个性化运行) | [庖丁解牛](#庖丁解牛) | [致谢](#致谢) |
|:--------:|:--------:|:--------:|:--------:|:--------:|:--------:|:--------:|:--------:|:--------:|:--------:|
概述
----------
> * C/C++
> * B/S模型
> * [线程同步机制包装类](https://github.com/qinguoyi/TinyWebServer/tree/master/lock)
> * [http连接请求处理类](https://github.com/qinguoyi/TinyWebServer/tree/master/http)
> * [半同步/半反应堆线程池](https://github.com/qinguoyi/TinyWebServer/tree/master/threadpool)
> * [定时器处理非活动连接](https://github.com/qinguoyi/TinyWebServer/tree/master/timer)
> * [同步/异步日志系统 ](https://github.com/qinguoyi/TinyWebServer/tree/master/log)
> * [数据库连接池](https://github.com/qinguoyi/TinyWebServer/tree/master/CGImysql)
> * [同步线程注册和登录校验](https://github.com/qinguoyi/TinyWebServer/tree/master/CGImysql)
> * [简易服务器压力测试](https://github.com/qinguoyi/TinyWebServer/tree/master/test_presure)
框架
-------------
<div align=center><img src="http://ww1.sinaimg.cn/large/005TJ2c7ly1ge0j1atq5hj30g60lm0w4.jpg" height="765"/> </div>
Demo演示
----------
> * 注册演示
<div align=center><img src="http://ww1.sinaimg.cn/large/005TJ2c7ly1ge0iz0dkleg30m80bxjyj.gif" height="429"/> </div>
> * 登录演示
<div align=center><img src="http://ww1.sinaimg.cn/large/005TJ2c7ly1ge0izcc0r1g30m80bxn6a.gif" height="429"/> </div>
> * 请求图片文件演示(6M)
<div align=center><img src="http://ww1.sinaimg.cn/large/005TJ2c7ly1ge0juxrnlfg30go07x4qr.gif" height="429"/> </div>
> * 请求视频文件演示(39M)
<div align=center><img src="http://ww1.sinaimg.cn/large/005TJ2c7ly1ge0jtxie8ng30go07xb2b.gif" height="429"/> </div>
压力测试
-------------
在关闭日志后,使用Webbench对服务器进行压力测试,对listenfd和connfd分别采用ET和LT模式,均可实现上万的并发连接,下面列出的是两者组合后的测试结果.
> * Proactor,LT + LT,93251 QPS
<div align=center><img src="http://ww1.sinaimg.cn/large/005TJ2c7ly1gfjqu2hptkj30gz07474n.jpg" height="201"/> </div>
> * Proactor,LT + ET,97459 QPS
<div align=center><img src="http://ww1.sinaimg.cn/large/005TJ2c7ly1gfjr1xppdgj30h206zdg6.jpg" height="201"/> </div>
> * Proactor,ET + LT,80498 QPS
<div align=center><img src="http://ww1.sinaimg.cn/large/005TJ2c7ly1gfjr24vmjtj30gz0720t3.jpg" height="201"/> </div>
> * Proactor,ET + ET,92167 QPS
<div align=center><img src="http://ww1.sinaimg.cn/large/005TJ2c7ly1gfjrflrebdj30gz06z0t3.jpg" height="201"/> </div>
> * Reactor,LT + ET,69175 QPS
<div align=center><img src="http://ww1.sinaimg.cn/large/005TJ2c7ly1gfjr1humcbj30h207474n.jpg" height="201"/> </div>
> * 并发连接总数:10500
> * 访问服务器时间:5s
> * 所有访问均成功
**注意:** 使用本项目的webbench进行压测时,若报错显示webbench命令找不到,将可执行文件webbench删除后,重新编译即可。
更新日志
-------
- [x] 解决请求服务器上大文件的Bug
- [x] 增加请求视频文件的页面
- [x] 解决数据库同步校验内存泄漏
- [x] 实现非阻塞模式下的ET和LT触发,并完成压力测试
- [x] 完善`lock.h`中的封装类,统一使用该同步机制
- [x] 改进代码结构,更新局部变量懒汉单例模式
- [x] 优化数据库连接池信号量与代码结构
- [x] 使用RAII机制优化数据库连接的获取与释放
- [x] 优化代码结构,封装工具类以减少全局变量
- [x] 编译一次即可,命令行进行个性化测试更加友好
- [x] main函数封装重构
- [x] 新增命令行日志开关,关闭日志后更新压力测试结果
- [x] 改进编译方式,只配置一次SQL信息即可
- [x] 新增Reactor模式,并完成压力测试
源码下载
-------
目前有两个版本,版本间的代码结构有较大改动,文档和代码运行方法也不一致。重构版本更简洁,原始版本(raw_version)更大保留游双代码的原汁原味,从原始版本更容易入手.
如果遇到github代码下载失败,或访问太慢,可以从以下链接下载,与Github最新提交同步.
* 重构版本下载地址 : [BaiduYun](https://pan.baidu.com/s/1dFdDR3QDbIXX71C2OJ-x2g)
* 提取码 : hr8n
* 原始版本(raw_version)下载地址 : [BaiduYun](https://pan.baidu.com/s/1-icglZGmz8cYqGCZhsN78A)
* 提取码 : 496d
* 原始版本运行请参考[原始文档](https://github.com/qinguoyi/TinyWebServer/tree/raw_version)
快速运行
------------
* 服务器测试环境
* Ubuntu版本16.04
* MySQL版本5.7.29
* 浏览器测试环境
* Windows、Linux均可
* Chrome
* FireFox
* 其他浏览器暂无测试
* 测试前确认已安装MySQL数据库
```C++
// 建立yourdb库
create database yourdb;
// 创建user表
USE yourdb;
CREATE TABLE user(
username char(50) NULL,
passwd char(50) NULL
)ENGINE=InnoDB;
// 添加数据
INSERT INTO user(username, passwd) VALUES('name', 'passwd');
```
* 修改main.cpp中的数据库初始化信息
```C++
//数据库登录名,密码,库名
string user = "root";
string passwd = "root";
string databasename = "yourdb";
```
* build
```C++
sh ./build.sh
```
* 启动server
```C++
./server
```
* 浏览器端
```C++
ip:9006
```
个性化运行
------
```C++
./server [-p port] [-l LOGWrite] [-m TRIGMode] [-o OPT_LINGER] [-s sql_num] [-t thread_num] [-c close_log] [-a actor_model]
```
温馨提示:以上参数不是非必须,不用全部使用,根据个人情况搭配选用即可.
* -p,自定义端口号
* 默认9006
* -l,选择日志写入方式,默认同步写入
* 0,同步写入
* 1,异步写入
* -m,listenfd和connfd的模式组合,默认使用LT + LT
* 0,表示使用LT + LT
* 1,表示使用LT + ET
* 2,表示使用ET + LT
* 3,表示使用ET + ET
* -o,优雅关闭连接,默认不使用
* 0,不使用
* 1,使用
* -s,数据库连接数量
* 默认为8
* -t,线程数量
* 默认为8
* -c,关闭日志,默认打开
* 0,打开日志
* 1,关闭日志
* -a,选择反应堆模型,默认Proactor
* 0,Proactor模型
* 1,Reactor模型
测试示例命令与含义
```C++
./server -p 9007 -l 1 -m 0 -o 1 -s 10 -t 10 -c 1 -a 1
```
- [x] 端口9007
- [x] 异步写入日志
- [x] 使用LT + LT组合
- [x] 使用优雅关闭连接
- [x] 数据库连接池内有10条连接
- [x] 线程池内有10条线程
- [x] 关闭日志
- [x] Reactor反应堆模型
庖丁解牛
------------
近期版本迭代较快,以下内容多以旧版本(raw_version)代码为蓝本进行详解.
* [小白视角:一文读懂社长的TinyWebServer](https://huixxi.github.io/2020/06/02/%E5%B0%8F%E7%99%BD%E8%A7%86%E8%A7%92%EF%BC%9A%E4%B8%80%E6%96%87%E8%AF%BB%E6%87%82%E7%A4%BE%E9%95%BF%E7%9A%84TinyWebServer/#more)
* [最新版Web服务器项目详解 - 01 线程同步机制封装类](https://mp.weixin.qq.com/s?__biz=MzAxNzU2MzcwMw==&mid=2649274278&idx=3&sn=5840ff698e3f963c7855d702e842ec47&chksm=83ffbefeb48837e86fed9754986bca
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
webbench网络测试 (161个子文件)
051f2960035e9de9e1fbf192562645d52cc9e9 326B
webbench.1 2KB
109b79cc04124e4126f6e81a93dddac0ccfc40 1KB
118396fd4cc63d419bdf3984badc9eb41aa1f6 5.13MB
13fa497b55c1d6262a96fd458a45d5ed5a88dc 128B
15fb02cdb3e0be7e7c6c8f6a80c9eedc90723c 238B
1e88ba45aaf76e7cfa6f9b92d73d0ad3993360 236B
1eeb9e9f8b2b4b0d119366dda99c6fd7d35c64 4KB
1f7b813bee2af8a1e59854a9e8725a9de7e312 311B
2178807c5eaac2a0b8da45a02d37f277b24605 840B
26672ce2c5ef5c3975be46da86abfdecc43ffb 32B
2b52336427da113554a566b316ceafc8165443 121KB
314d01c59911c46a481e5bca63c008cc84d2d3 148B
3321a4389b24e7445017147d3bde0c5f9b0c2c 538B
3446e220abaf56df31a3140a3389cdaae15f08 86B
38a06eaf6f9ae4de343f66d5dec90b852d76ef 563B
3a59b70696932780e21899f5723fe641c86db0 164B
3b4926f5a977b29d3368506541c891d038813b 260B
428e351de39877020cc951205e418824cefb1f 117B
42aa26f16069dfd81536c6f1bd1933460abaee 210B
4fbba54c1ff9fe1e5d51b308fbddcb4a75cad9 37.83MB
571fc1de48fe422b9c800d164b48d550c710ac 173B
59ab4ecc1454fe7b3fef81e681b63e880e94e8 6KB
5d305efca6fa267c969d11c0ea9ae02f5ef627 4KB
60b68284b972822af669095604705ff29e5a17 476B
60ce82089ac33729c60aecc50348daad42a2bb 32B
64c7fa8e76c004d4ec2c60cae6d7ddd145d545 880B
64f2467372e6e25a237b8605d0c4ceb96e66ab 17KB
65aaa63a61f5518ae1b10065486daa9c66c49c 92B
6a3b03c2ece5fb0d0a73efbd3e950ed7d83858 180KB
6a69ecfbff83f7faf21f7cc53aa954e91bfe67 626B
6aa8f8006b6eb764bec7615233569a0c5cf0b7 70KB
6d36524aa3b545c556d1c75f442e129f62501e 1KB
6d370fce625e06ad48b355116b78607c23f3d0 322B
79db85d5369a38f71d4699a05b853e37170b6c 426B
7a3225f4ca366d3bf6ec5e26194f959154bfe8 90B
7a434005c4ea7f87e02d8102a6bd47f560a45a 5.76MB
7a95e7ddff471b55476f34a316fe15cfeacf13 5KB
7d168d812c8617d8c03947928cc2c573ce2ea3 337B
7db57ea2cb7e45a1b6bdd88537d532e54cb943 434B
7df516dc1cce2467405a69face09dce80f469b 400B
803a1123a157448261caea8e0307a9c4da1247 596B
81a13e76f18b3c0343edde463df64e98475885 922B
848a6121807f0f7f26b6c387b90b01a6530d3f 1KB
85d1d2e2128fb34de59dc5328f087abfc5f915 660B
881eda3a544eaa86b6019cbe7067ffc58bfafc 22B
8f1d0428bc46528ca5bcbecd378f56c9f9e465 118B
972af402b598a0f857c190a2166968a1bb47a1 1KB
9ce15285d4d84fdf4001787ca643638ac4708b 40B
9d21d41e66964527afe72a746038f55b027feb 260B
9e78d2c98039802d91d72133c68c32ba61c1a7 311KB
a39c2eb699ac1889498c71f9ac059de98fad15 229KB
a607125e0a04c7fd481cd3dfd655f5f00aa598 477B
a7f7ba2823984809270de288184228cbb38988 639B
ab2149c2b5cee1e17cb5accc4d33b00467a5d2 780B
af54a0ee32a166ff9db1c7f9a47c1da8c5bd32 690B
b48507e85be496a83f12f789a625f0a0e09c2f 19KB
webbench.c 11KB
socket.c 1KB
c3ee65fc2828290fa7f311bd745d54f33835d1 1KB
c6179c62721333635d11218a85602fc5e3b605 292B
c63e02e63a1f95e46abcdaea0a4961aa2bab88 285B
c77bd5078fd5f50f90b58e86290d633a3e8648 1KB
changelog 2KB
ChangeLog 16B
COMMIT_EDITMSG 13B
config 242B
control 460B
copyright 242B
COPYRIGHT 16B
http_conn.cpp 18KB
webserver.cpp 11KB
lst_timer.cpp 4KB
log.cpp 4KB
sql_connection_pool.cpp 2KB
config.cpp 2KB
main.cpp 807B
d06da0535349710bbfb3ff7a4d61024d2ec092 230KB
d285bef015612069524cd639d60fbc33d0cef4 711B
d8b9eabc0fec827bbfd4e8e136127ba0a3903d 362B
d95e0e9e617c9d1a384d505b2f02acc660bbb8 372B
de9ff37906f610b7934944c71fb7def7da1a6d 3KB
dec7185a548c762dfba4659beee82d9052fb71 228B
description 73B
dfae0b18bdf608adcdee8bc99bbf80bc9c1950 3KB
dirs 7B
e10be037fbd010cdfddbbcdd30c4a88ef147cc 121B
e877431d8314b9547b8083e2d7354374b503b0 224B
e8ad46b8c485467d600cd8354f2659571e29a6 2KB
ec1c6cb37a0183106f0aa6464b56e429237174 5.69MB
exclude 240B
fba9bd494662ae9866d9aaaa86b92d617d7b10 2KB
fc2d7d440285c71d20a1fc2221712ca061d486 316B
fdb70c5bca909cd32db7498de3a19d2848dcd5 177B
FETCH_HEAD 0B
sql_connection_pool.h.gch 3.48MB
picture.gif 5.77MB
video.gif 5.7MB
loginnew.gif 339KB
registernew.gif 268KB
共 161 条
- 1
- 2
资源评论
qg_tt
- 粉丝: 4
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功