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.pswp.cn/news/370685.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370685.shtml
英文地址,請注明出處:http://en.pswp.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_…