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,一经查实,立即删除!

相关文章

DBMS-基本概念

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

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

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

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

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

关于图片预加载的思考

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

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_…

jacob 报错 Can't co-create object

问题&#xff1a;开始时一切正常&#xff0c;后来什么都没该&#xff0c;出现Cant co-create object报错&#xff0c;即是创建不了ActiveXComponent wdnew ActiveXComponent("Word.Application"); 偶尔发现任务管理器中word进程居然达到10个&#xff0c;而我没有打开…

wxpython可视化_使用wxPython的绘图模块wxPyPlot进行数据可视化

[Python进阶(四十)-数据可视化の使用matplotlib进行绘图前言  matplotlib是基于Python语言的开源项目&#xff0c;旨在为Python提供一个数据绘图包。我将在这篇文章中介绍matplotlib A #-*- coding: utf-8 -*- ############################################################…

如何让浮动的元素换行??css

当你想要做成这种布局效果的时候 紫色框里面的内容那样 它是一个列表 li元素是块级元素 默认大小是父元素ul的宽 并且换行 如果li没有背景的话那就不用管了 可是问题来了它不但有背景 而且是根据文字自适应的宽高 这就是inline-block类型的功能了 那么想让li是inline-bl…

设置博客园标题样式

1.向博客园申请js权限 我们需要进入博客园自定义博客模板的页面&#xff0c;向博客园管理团队申请页面运行js的权限。【博客园】->【设置】->【博客设置】&#xff0c;点击页面上的js权限申请&#xff0c;然后填写申请的理由&#xff0c;耐心等几分钟&#xff0c;再刷新一…

关联查询mysql_《MySQL数据库》关联查询

原标题&#xff1a;《MySQL数据库》关联查询一、关联查询1、概念在查询数据时&#xff0c;所需要的数据不只在一张表中&#xff0c;可能在两张或多张表中。这个时候&#xff0c;需要同时操作这些表来查询数据&#xff0c;即关联查询。关联查询所涉及到的表与表之间都会存在有关…

NOIP2017年11月9日赛前模拟

最后一次NOIP模拟了 题目1&#xff1a;回文数字 Tom 最近在研究回文数字。  假设 s[i] 是长度为 i 的回文数个数&#xff08;不含前导0&#xff09;&#xff0c;则对于给定的正整数 n 有&#xff1a; 以上等式中最后面的括号是布尔表达式&#xff0c;Tom 想知道S[n] mod 2333…

mysql视图表怎么设置约束_MySQL一一sql的视图、索引、约束

一、视图本质上相当于一张**“虚拟表”**&#xff0c;可当作独立的一张表进行操作(增、删、改、查)** 作用&#xff1a;**** a)**可通过权限控制&#xff0c;只将“表中的少数列”暴露给数据库用户&#xff0c;而不让该用户直接操纵数据库中“实际表”** b)**…

Software Development Life Cycle

转载于:https://www.cnblogs.com/genezhao/p/6879848.html

ArrayAndString(数组和字符串)

1.实现一个算法&#xff0c;确定一个字符串的所有字符是否全都不同。假使不允许使用额外的数据结构&#xff0c;又该怎么处理&#xff1f; public class UniqueChars {public static void main(String[] args) {// TODO Auto-generated method stubString string "abcdef…

position 的属性值

理论上来说&#xff0c;全部 position 的取值有8个 包括&#xff1a;position&#xff1a;static | relative | absolute | fixed | sticky | initial | inherit | unset 其中最常用的是 static 、relative、absolute、fixed 和 sticky initial、inherit、unset 是css的关键…

mysql数据库应用的权限层级_MySQL数据库的用户权限管理

嗨&#xff01;各位小伙伴今天翻了一下历史记录MySQL 数据库还有点内容今天开始我们就来补上吧~用户权限管理伙伴们要知道&#xff0c;在数据库方面有两个方向。一个是数据库管理员(Database Administrator)简称DBA&#xff0c;一个是数据库开发工程师(Database Developer)&…

linux i2c adapter 增加设备_Linux驱动之I2C驱动架构

一、Linux的I2C体系结构主要由三部分组成&#xff1a;(1) I2C核心提供I2C控制器和设备驱动的注册和注销方法&#xff0c;I2C通信方法&#xff0c;与适配器无关的代码以及探测设备等。(2) I2C控制器驱动(适配器)(3) I2C设备驱动二、重要的结构体i2c_adapter//i2c控制器(适配器)i…

Alpha-end

前言 失心疯病源10团队代码管理github个人感悟 肝不动了&#xff0c;肝不动了。明天如果见不到我&#xff0c;不要太想我。站立会议 队名&#xff1a;PMS530雨勤&#xff08;组长&#xff09; 今天完成了那些任务 熬夜肝代码代码签入github明天的计划 肝到凌晨还剩下哪些任务 团…

避免写慢SQL

最近在整理数据库中的慢SQL&#xff0c;同时也查询了相关资料。记录一下&#xff0c;要学会使用执行计划来分析SQL。 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一&#xff0c;而且这是被MySQL的数据库引擎处理的。当有很多相同…