asp.net尚未在web服务器上注册_最新版Web服务器项目详解 00 项目概述

点 击 关 注 上 方"两猿社

设 为"置 顶 或 星 标",干 货 第 一 时 间 送 达。

5094a9e2e6293416bd02a4ea9a21d451.png

互 联 网 猿 | 两 猿 社

TineyWebServer

Linux下C++轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的服务器.

  • 使用线程池 + epoll(ET和LT均实现) + 模拟Proactor模式并发模型

  • 使用状态机解析HTTP请求报文,支持解析GET和POST请求

  • 通过访问服务器数据库实现web端用户注册、登录功能,可以请求服务器图片和视频文件

  • 实现同步/异步日志系统,记录服务器运行状态

  • 经Webbench压力测试可以实现上万的并发连接数据交换

框架

  • 项目框架主要分为I/O处理单元、逻辑处理单元和存储单元三个模块

    • I/O处理单元和逻辑处理单元对应半同步/半反应堆线程池

    • 逻辑处理单元和存储单元对应数据库连接池和日志系统

  • 半同步/半反应堆线程池将web端和服务器端建立通信

    • 实现http请求报文的处理与响应

    • 定时器完成非活动连接的处理

  • 数据库连接池避免频繁访问数据库,实现登录和校验功能

  • 日志系统实现同步和异步两种方式记录服务器运行状态

e36167e13968e0abd36b83d9204299f5.png

工作流程

以一个请求到来具体的处理过程介绍项目工作流程,具体包括web端和服务器建立连接,访问服务器数据库完成登录和注册,并通过定时器完成非活动连接的处理,最后服务器运行状态通过日志系统进行记录。

  • web端和服务器端建立连接

    • 采用epoll的边缘触发模式同时监听多个文件描述符,采用同步I/O模拟proactor模式处理事件,主线程负责监听客户端是否发起请求

    • 当web端发起http请求时,主线程接收请求报文,然后将任务插入请求队列,由工作线程通过竞争从请求队列中获取任务

    • 通过http类中的主从状态机对请求报文进行分析,根据请求报文对客户端进行http响应,然后由主线程给客户端发送响应报文。

  • 连接数据库

    • 单例模式创建数据库连接池,避免频繁建立连接,用于后续web端登录和注册校验访问服务器数据库

  • 实现web端的登录和注册

    • web访问的欢迎界面为GET请求,登录和注册界面是POST请求

    • 欢迎界面有新用户(0)和已有账号(1)两个选项,若选择新用户,会跳转注册(3)界面,注册成功或选择已有账号,跳转登录(2)界面,注册或登录失败会提示失败,成功和失败为0,1

  • 同步/异步日志系统,记录服务器运行状态

    • 同步的方式下,工作线程直接写入日志文件

    • 异步会另外创建一个写线程,工作线程将要写的内容push进请求队列,通过写线程写入文件

    • 日志文件支持按日期分类,和超过最大行数自动创建新文件

  • 非活动连接的处理

    • 由于非活跃连接占用了连接资源,严重影响服务器的性能,通过实现一个服务器定时器,处理这种非活跃连接,释放连接资源。

    • 利用alarm函数周期性地触发SIGALRM信号,该信号的信号处理函数利用管道通知主循环执行定时器链表上的定时任务.

Demo

  • 注册演示

15401b37b75392bc88687319903f69ea.gif

  • 登录演示

8f8c114289b2f982e06884d0bd37d5c0.gif

  • 请求图片文件演示(6M)

0c699ebef267529514e93d096ed26643.gif

  • 请求视频文件演示(39M)

764594ba3062c89e6a0c6cf76ae27b29.gif

压力测试

Webbench对服务器进行压力测试,在ET非阻塞和LT阻塞模式下均可实现上万的并发连接.

  • ET非阻塞

482e7f96ac342bfa2c53166c47ff9405.png

  • LT阻塞

d1d345eb28b74e0308046e740ec0f049.png

  • 并发连接总数:10500

  • 访问服务器时间:5s

  • 所有访问均成功

注意: 使用本项目的webbench进行压测时,若报错显示webbench命令找不到,将可执行文件webbench删除后,重新编译即可。

基础测试

  • 服务器测试环境

    • Ubuntu版本16.04

    • MySQL版本5.7.29

  • 测试前确认已安装MySQL数据库

     1//建立yourdb库
    2create database yourdb set utf8;
    3
    4//创建user表
    5USE yourdb;
    6CREATE TABLE user( 7    username char(50) NULL, 8    passwd char(50) NULL 9)ENGINE=InnoDB;
    10
    11//添加数据
    12INSERT INTO user(username, passwd) VALUES('name', 'passwd');
  • 修改main.c中的数据库初始化信息

    1//root root为服务器数据库的登录名和密码
    2connection_pool *connPool=connection_pool::GetInstance("localhost","root","root","yourdb",3306,5);
  • 修改http_conn.cpp中的root路径

    1const char* doc_root="/home/qgy/TinyWebServer/root";
  • 生成server

    1make server
  • 启动server

    1./server port
  • 浏览器端

    1ip:port

个性化测试

个性化测试分为三种情况,分别是校验方式、I/O复用方式、日志写入方式。

校验方式

选择任一校验方式,代码中使用同步校验,可以修改为CGI.

  • 同步线程数据库校验

    • 关闭main.c中CGISQLPOOL,打开SYNSQL

      123 #define SYNSQL    //同步数据库校验
      224 //#define CGISQLPOOL  //CGI数据库校验
    • 关闭http_conn.cpp中两种CGI,打开SYNSQL

      17 //同步校验
      28 #define SYNSQL
      3
      410 //CGI多进程使用链接池
      511 //#define CGISQLPOOL
      6
      713 //CGI多进程不用连接池
      814 //#define CGISQL
  • CGI多进程数据库校验,不使用连接池

    • 关闭main.c中SYNSQL和CGISQLPOOL

      123 //#define SYNSQL    //同步数据库校验
      224 //#define CGISQLPOOL  //CGI数据库校验
    • 关闭http_conn.cpp中SYNSQL和CGISQLPOOL,打开CGISQL

      17 //同步校验
      28 //#define SYNSQL
      3
      410 //CGI多进程使用链接池
      511 //#define CGISQLPOOL
      6
      713 //CGI多进程不用连接池
      814 #define CGISQL
    • 关闭sign.cpp中的CGISQLPOOL,打开CGISQL

      112 #define CGISQL    //不使用连接池
      213 //#define CGISQLPOOL  //使用连接池
    • 修改sign.cpp中的数据库初始化信息

      1//root root为服务器数据库的登录名和密码
      2connection_pool *connPool=connection_pool::GetInstance("localhost","root","root","yourdb",3306,5);
    • 生成CGISQL.cgi

      1make CGISQL.cgi
  • CGI多进程数据库校验,使用连接池

    • 关闭main.c中SYNSQL,打开CGISQLPOOL

      123 //#define SYNSQL    //同步数据库校验
      224 #define CGISQLPOOL  //CGI数据库校验
    • 关闭http_conn.cpp中SYNSQL和CGISQL,打开CGISQLPOOL

      17 //同步校验
      28 //#define SYNSQL
      3
      410 //CGI多进程使用链接池
      511 #define CGISQLPOOL
      6
      713 //CGI多进程不用连接池
      814 //#define CGISQL
    • 关闭sign.cpp中的CGISQL,打开CGISQLPOOL

      112 //#define CGISQL    //不使用连接池
      213 #define CGISQLPOOL  //使用连接池
    • 生成CGISQL.cgi

      1make CGISQL.cgi

I/O复用方式

选择任一I/O复用方式,代码中使用LT阻塞,可以修改为ET非阻塞.

  • LT阻塞

    • 关闭main.c中ET,打开LT

      128 //#define ET       //边缘触发非阻塞
      229 #define LT         //水平触发阻塞
    • 关闭http_conn.cpp中ET,打开LT

      116 //#define ET       //边缘触发非阻塞
      217 #define LT         //水平触发阻塞
  • ET非阻塞

    • 关闭main.c中LT,打开ET

      128 #define ET         //边缘触发非阻塞
      229 //#define LT       //水平触发阻塞
    • 关闭http_conn.cpp中LT,打开ET

      116 #define ET       //边缘触发非阻塞
      217 //#define LT         //水平触发阻塞

日志写入方式

选择任一日志方式,代码中使用同步日志,可以修改为异步写入.

  • 同步写入日志

    • 关闭main.c中ASYNLOG,打开同步写入SYNLOG

      125 #define SYNLOG //同步写日志
      226 //#define ASYNLOG   /异步写日志
  • 异步写入日志

    • 关闭main.c中SYNLOG,打开异步写入ASYNLOG

      125 //#define SYNLOG //同步写日志
      226 #define ASYNLOG   /异步写日志
  • 选择数据库访问、I/O复用方式或日志写入方式后,按照前述生成server,启动server,即可进行测试.

致谢

Linux高性能服务器编程,游双著.

如果本文对你有帮助,阅读原文star一下服务器项目,我们需要你的星星^_^.

完。

b0725ce71bb9bf30a80026fbf3810940.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python正则r的作用_Python正则表达式,这一篇就够了!

原标题:Python正则表达式,这一篇就够了!大多数编程语言的正则表达式设计都师从Perl,所以语法基本相似,不同的是每种语言都有自己的函数去支持正则,今天我们就来学习 Python中关于 正则表达式的函数。re模块…

服务器微信了早上好,每天早上好的问候语 微信早安问候语合集66句

1、没有伞的孩子,必须努力奔跑!早安!2、你不能改变过去,但你可以改变未来。早安!3、坚持了才叫梦想,放弃了就只是妄想。早安!4、忘掉失败,不过要牢记失败中的教训。早安!…

如何得到某个文件的旧版本

下载某个文件的旧版本 如果想要得到某个文件的旧版本,只需在该文件上单击右键,选择Updata to revision…即可。 系统会提示输入版本号。 例如要下载soc_1的第五个版本,只需填入5即可。如图7。 查看完版本5的文件后,如果想在此回到…

Google Guava EventBus和Java 7 WatchService用于事件编程

这篇文章将介绍如何使用Guava EventBus将更改发布到Java 7 WatchService检测到的目录或子目录中。 Guava EventBus是向应用程序添加发布/订阅通信的好方法。 Java 7 java.nio.file软件包中新增的WatchService用于监视目录中的更改。 由于EventBus和WatchService已在以前的文章中…

Bootstrap-table 部分浏览器显示不出来

一、问题 近日,写了一个ASP.Net项目,但是bootstrap-table在别人的电脑上显示不出来,在自己的电脑上能显示,有些浏览器也是能显示,但部分浏览器就是显示不出来。找了很多原因,最后有个老师和我说是内核版本的…

DBMS-基本概念

文件处理系统(file-processing system)的主要弊端: 数据冗余和不一致(data redundancy and inconsistency)、数据访问困难(difficulty in accessing data)、数据孤立(data isolation…

python多大孩子可以学_孩子学编程最佳年龄是多大

儿童编程教育已经悄悄地掀起了编程低龄化的热浪。但是很多人会疑惑,到底孩子学编程最佳年龄是多少呢?下面小编就为大家解答一下。孩子学编程最佳年龄 首先,孩子的学习黄金时期是非常重要的。从6岁开始,大多数孩子都可以掌握对基本…

上传文件到华为云云服务器,上传文件到云服务器

上传文件到云服务器 内容精选换一换登录Windows操作系统的弹性云服务器时,需使用密码方式登录。因此,用户需先根据创建弹性云服务器时使用的密钥文件,获取该弹性云服务器初始安装时系统生成的管理员密码(Administrator帐户或Cloudbase-init设…

JUnit规则

第一次偶然发现JUnit Rule批注时,我对此概念有些恼火。 在测试用例中拥有一个公共领域似乎有些奇怪,因此我不愿意定期使用它。 但是一段时间后,我习惯了这一点,事实证明,规则可以通过多种方式简化编写测试的过程。 这篇…

微pe工具箱是微软的吗_微PE工具箱V2.0更新10内核

本帖最后由 韦小宝2 于 2017-3-22 21:26 编辑微PE工具箱V2.0发布更新了,链接:http://pan.baidu.com/s/1c9whpO 转载自无忧论坛 07年,第一个XP内核通用PE工具箱发布。17年,第一个WIN10内核的微PE工具箱就此诞生。64位纯内核&#x…

jq实现轮播图

之前设计了一个校团委网站,里面有一个轮播图效果,上网后查看了许多方法,觉得下面这个方法最为适用,记录下来 js代码: $(document).ready(function () {//无缝切换轮播var i 0;//索引var clone $(".banner .imgL…

关于图片预加载的思考

引子&#xff1a; 很多时候&#xff0c;我们在写html页面的时候&#xff0c;当需要在页面中加入图片时&#xff0c;我们很自然地把图片直接用<img>标签放在了<body>里面&#xff0c;这本来是没有多大问题的。 但是当图片数量很多的时候&#xff0c;问题就来了。H…

oracle安装中桌面模式与服务器模式的去别

桌面模式只能本机使用。 服务器模式可以在网络中使用&#xff0c;也就是网络中的其他服务器可以使用。 所以安装时&#xff0c;如果是生产环境肯定是服务器模式。一般也都是服务器模式。 转载于:https://www.cnblogs.com/zhjx0521/p/7803691.html

python不能创建字典的是_用Python创建带有重复键的字典

用Python创建带有重复键的字典 我有以下列表&#xff0c;其中包含重复的具有不同值的汽车注册号。 我想将其转换为字典&#xff0c;该字典接受汽车登记号的多个键。 到目前为止&#xff0c;当我尝试将列表转换为字典时&#xff0c;它消除了键之一。 如何制作具有重复键的字典&a…

python中int是什么的缩写_python中int是什么类型

python中的基本数据类型1:虽然python中的变量不需要声明&#xff0c;但使用时必须赋值整形变量浮点型变量字符型2:可以一个给多个变量赋值&#xff0c;也可以多个给多个变量赋值3:python3中有6个标准数据类型Number(数字)*True1*False0*数值的除法(/)总是返回一个浮点数&#x…

redis cli命令

redis安装后&#xff0c;在src和/usr/local/bin下有几个以redis开头的可执行文件&#xff0c;称为redis shell&#xff0c;这些可执行文件可做很多事情。 可执行文件作用redis-server 启动redisredis-cliredis命令行工具redis-benchmark基准测试工具redis-check-aofAOF持久化文…

高级ZK:异步UI更新和后台处理–第2部分

介绍 在第1部分中&#xff0c;我展示了如何在ZK应用程序中使用服务器推送和线程来执行后台任务。 但是&#xff0c;这个简单的示例具有一个重大缺陷&#xff0c;这使其对于实际应用程序而言是一种不好的方法&#xff1a;它为每个后台任务启动了一个新线程。 JDK5引入了Execut…

css清除浮动的原理

最近学习css发现了高度塌陷时候要清除浮动,为了理解清楚浮动原理,网上找了不少资料,发现都写的不是很清楚,而且都是一模一样的内容,我在里分享一下我对清楚浮动原理的理解, 如果你已经很了解什么是浮动和浮动的效果你可以直接跳转到三.如何清除浮动(重点)阅读 一.什么是浮动首…

SpringBoot03 项目热部署

1 问题 在编写springBoot项目时&#xff0c;经常需要修改代码&#xff1b;但是每次修改代码后都需重新启动&#xff0c;修改的代码才会生效 2 这么实现IDEA能够像Eclipse那样保存过后就可以自动进行刷新呢 将springBoot项目进行热部署即可 3 如何实现SpringBoot项目的热部署01 …

STM32实现流水灯

led.c #include"led.h"void Led_Init(void) {GPIO_InitTypeDef GPIO_VALUE; //???RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//???GPIO_VALUE.GPIO_ModeGPIO_Mode_Out_PP;//???? ????GPIO_VALUE.GPIO_PinGPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_…