入门C++网络编程,刚开始会学习一些基础API或者书上的回射服务器、聊天室、简单HTTP服务器实现,学完上述基础后,我们肯定想大显身手做一个像样项目,但看来看去也不知道该怎么入手,或者不知道一个像样项目的框架是什么。

我建议刚开始不要上来就钻网络框架,也不适合入手成熟复杂的项目,最好是找一些基础开源项目,根据自己的想法在其基础上添砖加瓦或者重新写一遍,有了这些基础后,再谈精进。

其实,对于初学者来说,最难的就是找到一个容易入门的,基础的后台开发项目

这时候,很多人都会推荐推荐陈硕大佬的书和木铎,我也推荐。

但我建议,在读陈大佬的书之前,可以先看一下游双的Linux高性能服务器编程,将书上的代码和例程跑一遍,再去看muduo,肯定会更有收获。

C++后台开发,一般的是指服务器端开发,涉及的模型有C/S模型和B/S模型。其中C/S模型更多的是关注TCP协议,服务器端和客户端都需要自己完成,数据包也需要自己设计;B/S模型更多的关注HTTP协议,因为以浏览器充当客户端,并且有现成的HTTP协议,所以重点在服务器端。

我们看大多数书上的讲解目录,都是先讲C/S模型,再讲B/S模型。相对于入门来说,书上的回射服务器和聊天室程序更容易入门和理解,但要想做一个拿得出手的C/S模型项目,个人觉得还是不容易的。

从面试做项目的角度,我个人更倾向先从简易的B/S模型入手,然后再过渡到简易的C/S模型。这样我们可以跳过客户端和数据包的设计,将更多重点放在服务器端,尽快完成一个小demo,提升初学者的信心。

在这里我将去年面试秋招时候我所准备的项目分享给大家,希望对刚入门的小伙伴有所帮助,这个项目目前还在更新和维护。

项目链接:https://github.com/qinguoyi/TinyWebServer

项目简介

去年秋招的时候,读完游双的高性能Linux服务器编程后,我根据书上的代码攒了一个Linux下C++轻量级Web服务器的项目,在原来的基础上实现了简单注册和登录等简单前台交互和后台访问功能,经压力测试可以实现上万的并发连接。(测试机器为Intel i7 7700,16G内存)。

Linux下C++轻量级Web服务器虽然是toy级别的项目,但只要你按照README中的步骤运行,经多个同学测试,一次就可以跑通,这将极大增强初学者做项目的信心。

  • 注册演示
  • 登录演示

经过各位小伙伴的反馈,一旦请求服务器文件较大文件时,会出现问题,不是文件显示不全,就是无法显示。我分析定位到了问题后,做了初步修正,并实现了Demo。等代码测试完成后,我会将其同步到Github

目前对该Bug初步修正后,我在Ubuntu下的Chrome浏览器进行了大文件测试,请求服务器上的大图(6M)和视频(493k),效果如下。

  • 视频测试
  • 大图测试

测试结果

Webbench对服务器进行压力测试,可以实现上万的并发连接.

  • 并发连接总数:10500
  • 访问服务器时间:5s
  • 每秒钟响应请求数:552852 pages/min
  • 每秒钟传输数据量:1031990 bytes/sec
  • 所有访问均成功

框架

整体的框架就是下面这样子,模块联系比较简单,耦合性也不高,非常简陋,只求能看懂就好。

项目中所涉及的模块和知识点,我进行了整理,罗列在下面,每个模块都有对应知识的理解和运用。

  • 线程池

    • 涉及线程,锁机制。使用一个工作队列完全解除了主线程和工作线程的耦合关系:主线程往工作队列中插入任务,工作线程通过竞争来取得任务并执行它。
  • HTTP请求与响应
    • 涉及Linux系统编程,网络编程,TCP和HTTP协议。根据状态转移,通过主从状态机封装了http连接类。其中,主状态机在内部调用从状态机,从状态机将处理状态和数据传给主状态机。
  • 注册登录
    • 涉及少许网页html知识。实现用户名和密码校验,另外通过html文件设置action实现跳转。
  • 定时器
    • 涉及Linux系统信号及数据结构的使用。由于非活跃连接占用了连接资源,严重影响服务器的性能,通过实现一个服务器定时器,处理这种非活跃连接,释放连接资源。
  • 数据库连接池
    • 涉及MySQL数据库。建立数据库连接池,通过重复使用这些已经建立的数据库连接,解决频繁建立连接的缺点,从而提高系统性能。
  • 同步/异步日志系统
    • 涉及设计模式,自定义阻塞队列。同步/异步日志系统主要涉及了两个模块,一个是日志模块,一个是阻塞队列模块,其中加入阻塞队列模块主要是解决异步写入日志做准备。
  • 压力测试
    • 阅读Webbench源码,对进程加深理解。通过Webbench创建多个进程,每个进程通过HTTP连接访问服务器,完成压力测试。

再次强调,代码大部是书上的,我只是整理成一个较为完善的项目,并加了一些功能,对所有做了一些注释和讲解。

如果对上面的项目模块原理有疑问,大家优先查阅游双的Linux高性能服务器编程,还有些模糊的话,欢迎来我公号查看系列讲解,最后实在搞不清楚,就直接骚扰我吧。

如果你对这个项目感兴趣,或者在学习项目过程有什么疑问,关注公众号【两猿社】可以直接联系我

感谢你能看到这里。

推荐!适合C++服务器编程初学者的基础开源项目相关推荐

  1. 编程初学者(零基础如何入门),我适合这个行业么

    编程初学者(零基础如何入门),我适合这个行业么 内容有点多,你忍一下! 文章目录 编程初学者(零基础如何入门),我适合这个行业么 前言 一.先简单的讲一下,如何学好编程语言: 第一步:定位 第二步:大 ...

  2. python快速编程入门课后程序题答案-Python编程从零基础到项目实战 完整PPT+习题答案...

    Python编程从零基础到项目实战是一本介绍Python相关知识的Python基础教程,内容涉及算法.Python数据分析.图形处理.Web开发.科学计算.项目管理.人工智能.Python爬虫等.其中 ...

  3. 适合初学者的安卓开源项目_开源初学者的6个起点

    适合初学者的安卓开源项目 Opensource.com几个月前问读者: 参与开源的最大障碍是什么? 来自56%的民意测验者的回答是他们不确定从哪里开始. 而且,有13%的人表示不愿意加入. 如果您有相 ...

  4. 零基础学python实战答案-Python编程从零基础到项目实战 完整PPT+习题答案

    Python编程从零基础到项目实战是一本介绍Python相关知识的Python基础教程,内容涉及算法.Python数据分析.图形处理.Web开发.科学计算.项目管理.人工智能.Python爬虫等.其中 ...

  5. 适合初学者的安卓开源项目_开源世界中初学者的颠簸之旅

    适合初学者的安卓开源项目 by Shubheksha 通过Shubheksha 开源世界中初学者的颠簸之旅 (A Beginner's Very Bumpy Journey Through The W ...

  6. 适合初学者的安卓开源项目_开源系列的初学者将从下周开始

    适合初学者的安卓开源项目 下周,Opensource.com将开始发布有关"从入门到开源"的系列文章. 这一系列文章将作为一种资源存在 ,任何人都可以随时访问以了解更多关于在任何位 ...

  7. 适合初学者的安卓开源项目_开源周初学者

    适合初学者的安卓开源项目 Opensource.com将发布文章,重点介绍从2月17日至28日对于初学者可以从开源开始的地方. 这些故事将包括在开源公司工作,在开源软件上工作以及构建开源应用程序的初次 ...

  8. Node 应用篇!推荐 10 个好用的 Node 的开源项目 YYDS

    大家好,我是你们的 猫哥,那个不喜欢吃鱼.又不喜欢喵 的超级猫又在线营业啦 ~ 平时如何发现好的开源项目,可以看看这篇文章:GitHub 上能挖矿的神仙技巧 - 如何发现优秀开源项目 1. puppe ...

  9. 初学者如何学习开源项目

    最近在考虑自己写一个Python开源项目,之前很少接触因此无从下爪,于是在Github上面找了一些适合初学者的练手项目,但面对诸多的代码文件也是有点头疼...所以特地整理了别人对于开源项目学习的建议. ...

最新文章

  1. 适定、超定和欠定方程的概念
  2. 让手机站点像原生应用的四大途径
  3. gridview 中使用 if else_前端代码中如何优化if/else
  4. bzoj 5090 组题
  5. Spark配置属性整理(非常全面)
  6. access中如何画斜线_大神支招:如何设计access行政区划菜单
  7. 前端和后端哪个工资高_新媒体运营和网络运维哪个好,哪个工资待遇高,门槛低?...
  8. [css] 举例说明attr()的使用场景
  9. Android平台如何实现屏幕数据采集并推送至RTMP服务器
  10. 用.net实现按透明度生成水印文件
  11. Altium Designer(三):基础
  12. mysql一主多从同步配置
  13. 9.4.3 BINARY与VARBINARY类型
  14. unity:瞄准镜制作
  15. Java开源项目管理工具大全
  16. 获取打印机分辨率_为孩子准备的第一台口袋打印机,喵喵机P2S评测
  17. HttpClient 报错 Invalid cookie header, Invalid 'expires' attribute: Thu, 01 Jan 1970 00:00:00 GMT...
  18. c语言fp函数,FP_INFINITE
  19. 基于Lucene的联系人拼音检索(第一部分)
  20. “我想学习人工智能与机器学习,该从何做起?”

热门文章

  1. java 异常之Cause: org.apache.ibatis.executor.ExecutorException: Executor was closed
  2. CentOS8 编译安装tsar nagios + nagios-plugins + nsca
  3. 手把手教你用量化做复盘(一)
  4. 青海行--(7月28日)凯旋归程
  5. C/S结构是什么意思?有什么优点?
  6. VLC-Android音频播放不完整问题踏坑
  7. 监控告警 Metrics - Prometheus
  8. 如何打造智能世界的数据底座?深耕华为云大数据,畅享价值最大化
  9. python生成基础头像_python个性化头像
  10. 计算机应用技术职业生涯规划书5000字,计算机应用职业生涯规划书5000字