myserver-helloword-UI
服务器端代码实现提供静态⻚⾯:
1234567router.addRoute("GET", "/login", [this](const HttpRequest& req) { HttpResponse response; response.setStatusCode(200); response.setHeader("Content-Type", "text/html"); response.setBody(readFile("path/to/login.html")); // 读取 HTML ⽂件 return response;});
处理表单提交:
123456router.addRoute("POST", "/login", [&db](const HttpRequest& req) { auto params = req.parseFormBody ...
myserver-helloword-threadpool
铺垫概念:
进程:
定义:进程是操作系统分配资源和调度的基本单位。它是⼀个程序的实例,包含了执⾏程序的代码和活动路径。
特点:每个进程都有⾃⼰独⽴的地址空间,进程间的资源(如内存、⽂件句柄等)是隔离的。进程间通信(IPC)需要特定的机制,如管道、消息队列、共享内存等。
资源消耗:进程的创建、销毁以及上下⽂切换通常⽐线程更消耗资源,因为它们涉及更多的系统资源,包括内存分配、加载程序等。
线程:
定义:线程是进程内的⼀个执⾏单元,是CPU调度和分派的基本单位。它⽐进程更轻量级,可以在进程内并发执⾏。
特点:同⼀进程内的线程共享该进程的资源,如内存、⽂件句柄等。线程间的通信和数据交换相对更容易,因为它们共享相同的地址空间。
资源消耗:线程的创建和销毁、以及上下⽂切换的资源消耗相对较⼩。
区别:
资源分配与独⽴性:进程是资源分配的单位,每个进程拥有独⽴的地址空间;线程是CPU调度的单位,是进程的⼀部分,多个线程共享同⼀进程的资源。
通信⽅式:进程间通信需要特定的机制,相对复杂;线程间由于共享内存,通信更为简便。
开销⼤⼩:创建、销毁进程的开销⼤于线程,进程间的切换开销也⼤于线程 ...
myserver-helloword-epoll
I/OI/O模型是是操作系统中处理输⼊输出操作的⼀种机制。它描述了应⽤程序如何与操作系统内核交互,以完成对外部设备(如⽹络、磁盘等)的数据读写操作。I/O 操作通常是阻塞的,可能导致应⽤程序等待数据的到来或传输完成,进⽽影响性能。I/O 操作⼀般分为两个阶段:
等待数据准备就绪:
外部设备与内核交互:当应⽤程序请求 I/O 操作时(例如,读取⽂件或接收⽹络数据),外部设备会将数据传输到操作系统内核中的缓冲区。
等待数据到达:在⽹络 I/O 中,内核可能需要等待⽹络接⼝控制器(NIC)接收数据包,将数据包放⼊⽹络缓冲区中;在磁盘 I/O 中,内核则需要等待磁盘驱动器将数据加载到内核的磁盘缓冲区中。等待时间取决于设备的响应速度。
阻塞和⾮阻塞 I/O:应⽤程序发起请求后,如果采⽤阻塞 I/O,应⽤程序会暂停执⾏,等待数据到达;如果采⽤⾮阻塞 I/O,应⽤程序在等待数据期间可以继续执⾏其他操作。内核会持续检查数据是否到达缓冲区。
将数据从内核空间复制到⽤⼾空间:
内核和⽤⼾空间的分离:现代操 ...
myserver-helloword-database
数据库简介
定义:数据库是⽤于存储、管理和处理数据的系统。它允许存储⼤量信息,⽀持数据的有效组织、存储、访问和更新。
作⽤:
数据存储:可持久存储各种数据,如⽂本、数字、图⽚等。
数据管理:提供管理数据的功能,如数据的增加、删除、修改和查询。
数据处理:⽀持对数据进⾏各种操作,以满⾜特定的业务需求。
数据查询:允许通过SQL(结构化查询语⾔)等查询语⾔进⾏⾼效数据检索。
应⽤场景:
商业数据存储、⽹站数据管理、移动应⽤数据处理等。
相关概念:
数据库管理系统(Database Management System,DBMS)是⽤于定义、创建、维护和控制据库的软件系统。它提供了数据的访问、管理和保护等功能,常⻅的 DBMS 包括 MySQL、PostgreSQL、SQLite 等
关系型数据库(Relational Database)是基于关系模型的数据库,数据以表格形式存储,表与表之间通过键进⾏关联。关系型数据库⽀持 SQL(结构化查询语⾔)进⾏数据操作。
SQL(Structured Query Language)是⽤于管理和查询关系型数据库的标准语⾔。它包括数据定义语⾔( ...
myserver-helloword-logger
⽇志系统的主要功能
记录访问⽇志:记录客⼾端的请求信息,包括请求时间、IP 地址、请求 URL、请求⽅法(如GET/POST)、响应状态码等。
错误⽇志:记录服务器运⾏中出现的错误或异常,帮助开发者快速定位问题。
性能监控:记录服务器性能数据,如请求处理时间、资源使⽤率等,便于优化性能。
安全审计:记录⽤⼾登录、访问控制和安全相关事件,⽤于安全审查和异常⾏为监控。
⽇志系统的重要性
问题排查与调试
错误定位:当系统发⽣异常或错误时,⽇志是快速定位问题的关键⼿段。通过⽇志,可以追踪代码的执⾏路径,找到错误发⽣的具体位置和原因。
调试辅助:在开发阶段,⽇志有助于了解程序的运⾏状态,验证逻辑是否正确,实现⾼效的调试过程。
系统监控与运维
性能监控:通过记录关键指标(如响应时间、请求数量、错误率等),⽇志可以帮助运维⼈员监控系统性能,及时发现瓶颈和异常。
安全审计:⽇志可以记录⽤⼾的操作⾏为,帮助识别潜在的安全威胁,满⾜合规性要求。
⽤⼾⾏为分析
数据驱动决策:通过分析⽇志中的⽤⼾⾏为数据,可以了解⽤⼾的使⽤习惯和偏好,指导产品优化和业务决策。
A/B ...
myserver-helloword-http
http基础Http基本知识HTTP(HyperText Transfer Protocol 超⽂本传输协议)是⼀种基于TCP/IP协议的应⽤层通信协议,主要⽤于万维⽹(WWW)中客⼾端与服务器之间的通信。它是互联⽹上数据交换的基础,允许⽤⼾从WWW服务器传输超⽂本⽂件到本地浏览器。HTTP的主要功能是定义了客⼾端如何向服务器请求⽹⻚内容以及服务器如何响应这些请求。
HTTP协议规定的内容HTTP协议规定的内容:(理解)
请求/响应模型: HTTP采⽤客⼾端-服务器模式,客⼾端(如Web浏览器)发送HTTP请求给服务器(如Web服务器),服务器处理请求并返回HTTP响应。
请求⽅法: 规定了多种请求⽅法,如GET、POST、PUT、DELETE等,每种⽅法对应不同的操作语义。例如,GET⽤于获取资源,POST⽤于提交数据创建新资源或更新现有资源。
状态码: 服务器在响应中会包含⼀个三位数字的状态码,如200表⽰成功,404表⽰未找到资源,500表⽰服务器内部错误等,⽤以告知客⼾端请求的处理结果。
消息头: 请求和响应中都包含了多个消息头字段,如Host、Conte ...
myserver-helloword-helloword
介绍
⽬标:学习使⽤C++和socket编程建⽴⼀个基础Web服务器。
内容概述:
理解Web服务器⼯作原理。
学习创建和监听socket。
掌握接收和响应HTTP请求的⽅法。
⼯作原理(重要)
监听端⼝
Web服务器在⽹络中开放⼀个或多个端⼝(如HTTP的默认端⼝80),⽤于监听客⼾端的请求。
当服务器绑定到特定端⼝后,它会持续检测该端⼝是否有传⼊的连接请求。
处理请求
当接收到请求时,服务器⾸先解析HTTP请求头和请求体的内容。
解析过程包括提取请求的⽅法(GET、POST等)、⽬标资源的URI、HTTP版本和请求头信等。
服务器还可以处理附加数据,例如在POST请求中提交的表单数据或上传的⽂件。
发送响应
根据请求的类型和资源,服务器确定响应的内容。这可能是HTML⻚⾯、图像、样式表、脚本⽂件或其他类型的数据。
服务器⽣成HTTP响应消息,包括状态⾏(如HTTP/1.1 200 OK)、响应头(如内容类型、内容⻓度等)和响应体(请求的资源或错误信息)。
最后,服务器通过与客⼾端建⽴的连接发送这个HTTP响应。
重要组成
静态内容处理:直接从服务器⽂件 ...
myserver-helloword
前置知识 - C++⾯向对象编程(OOP)
封装:通过public,private,protected 来实现类的访问权限。
继承:复⽤现有类功能的⽅式,通过派⽣新类来扩展原有类的功能,⽽⽆需重新编写原始代码。
多态:使⼀个类的不同实例在不同情况下表现出不同的⾏为特性,使得具有不同内部结构的
抽象:通过抽象类和接⼝定义对象的⾏为,忽略具体的实现细节。对象能够共享相同的外部接⼝,从⽽达到灵活和统⼀处理的⽬的。
静态多态(编译时多态):通过函数重载(Overloading)和模板技术(Templates)实现。
动态多态(运⾏时多态):通过虚函数(Virtual Functions)和继承关系实现。
静态全局变量(static)
静态成员变量:可以通过类名直接访问,⽆需创建类的对象,从程序开始到结束。
静态成员函数:不与任何对象实例关联,通过类名直接调⽤,可访问静态数据成员,不能直接访问⾮静态数据成员(需通过对象引⽤或指针)。
虚函数
纯虚函数:在基类中声明但没有提供实现的虚函数,必须在所有⾮抽象派⽣类中实现。纯虚函数使⽤=0来标识。
虚函数的⼯作基于运⾏时类型信息(RT ...
Linux 复习2
Linux操作系统的组成Linux 操作系统的组成可以从多个角度进行划分,主要包括以下几个部分:内核 (Kernel)、Shell、文件系统 和 实用程序和应用程序。每个部分在操作系统中扮演着不同的角色,协调工作以提供完整的操作系统功能。
Linux系统版本Linux 系统的版本有多种不同的类型,分内核版和发行版,通常根据发行版(distribution)来区分。不同的 Linux 发行版具有不同的功能、目标和用途。以下是一些常见的 Linux 系统版本的分类和概述:
1. Linux 内核版本Linux 内核是 Linux 操作系统的核心,内核的版本发布遵循一定的命名规则,并且定期进行更新。Linux 内核版本号通常由三部分组成:
主版本号:表示重大版本更新。
次版本号:表示较小的功能更新或修复。
修订号:表示安全补丁和错误修复。
例如,Linux 内核版本号 5.10.13 中:
5:主版本号。
10:次版本号。
13:修订号。
内核的更新通常包括硬件支持的增强、新的功能、性能改进和bug修复。
1.1 常见的 Linux 内核版本(截至 2024 年):
5.x 系列:这 ...
JAVA 期末复习总结
类的声明、定义在Java中,类是对象的蓝图或模板,定义了对象的属性(字段)和行为(方法)。下面是关于类的声明和定义的一些基础知识。
1. 类的基本声明和定义一个类的声明包括类名、类体以及其中的成员(字段、方法等)。
基本语法:123456789101112131415public class ClassName { // 字段(属性) int field1; String field2; // 构造方法 public ClassName() { // 初始化字段 } // 方法 public void method1() { // 方法体 }}
解释:
public:修饰符,表示该类是公共的,可以被其他类访问。
class ClassName:声明一个类,ClassName 是类名,按照Java命名规范,类名通常以大写字母开头。
{}:类体,包含类的字段和方法。
int field1;:字段声明,field1 是类的一个属性 ...