自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(130)
  • 收藏
  • 关注

原创 【校招项目】基于C++11的muduo库

本项目是参考 muduo 实现的基于 Reactor 模型的多线程网络库。使用 C++ 11 编写去除 muduo 对 boost 的依赖,内部实现了一个小型的 HTTP 服务器,可支持 GET 请求和静态资源的访问,且附有异步日志监控服务端情况。项目已经实现了 Channel 模块、Poller 模块、事件循环模块、HTTP 模块、定时器模块、异步日志模块、内存池模块、数据库连接池模块。

2022-12-13 01:29:12 4434 4

原创 【项目】使用C++11手写数据库连接池

项目链接。

2022-10-09 23:36:38 958 2

原创 (十五)使用Redis实现发布订阅功能

我们之前的ChatServer是维护了一个连接的用户表,每次向别的用户发消息都会从用户表中查看对端用户是否在线。然后再判断是直接发送,还是转为离线消息。但是现在我们是集群服务器,有多个服务器维护用户。我们的要聊天的对象在,在自己服务器的用户表中找不到。那么可能对端用户在线,它却给对端用户发送了离线消息。因此,我们需要保证跨服务器间的通信!那我们如何实现,非常直观的想法,我们可以让后端的服务器之间互相连接。

2022-09-28 17:40:09 1450 3

原创 (十四)引入负载均衡器

假设一台机器支持两万的并发量,现在我们需要保证八万的并发量。首先想到的是升级服务器的配置,比如提高 CPU 执行频率,加大内存等提高机器的物理性能来解决此问题。但是单台机器的性能毕竟是有限的,而且也有着摩尔定律也日已失效。这个时候我们就可以增加服务器的数量,将用户请求分发到不同的服务器上分担压力,这就是负载均衡。那我们就需要有一个第三方组件充当负载均衡器,由它负责将不同的请求分发到不同的服务器上。而本项目,我们选择Nginx的负载均衡功能。选择Nginx的tcpclientChatServer。

2022-09-28 17:38:01 663

原创 (十三)客户端实现

真正操作时候还是需要实现一个客户端进行操作的,总不能一直手写数据。

2022-09-28 17:35:08 312

原创 (十二)群组业务

*AllGroup表 ****GroupUser表 **

2022-09-28 17:34:18 501

原创 (十一)添加好友业务

提供了向数据库DB层好友表的接口,有着添加好友关系和返回好友列表两个方法。

2022-09-28 17:32:32 458

原创 (十)服务端异常退出

之前讲解了客户端异常退出的代码,但是服务端也是会异常退出的。如果服务端异常退出,它会将所有在线的客户的状态都设置为offline。即,让所有用户都下线。异常退出一般是CTRL + C时,我们需要捕捉信号。这里使用了 Linux 的信号处理函数,我们向信号注册回调函数。函数的实现。

2022-09-28 17:31:31 516

原创 (九)离线消息业务代码

OfflineMessage表。

2022-09-28 17:30:16 209

原创 (八)点对点聊天业务处理

通过 JSON 对象的toid找寻对话用户

2022-09-28 17:29:08 239

原创 (七)客户端异常退出事件处理

如果客户端异常退出了,我们会从服务端记录用户连接的_connMap表中找到改用户,如果它断连了就从此表中删除,并设置其状态为offline。因为记录用户连接情况的表是可能被多个线程操作的,所以访问表的操作都要使用互斥锁进行保护。

2022-09-28 17:27:18 518

原创 (六)用户登录模块讲解

从json对象中获取用户ID和密码,并在数据库中查询获取用户信息。如果用户已经登录过,即,则返回错误信息。登录成功后,需要在用户表中记录新登录的用户。考虑到多线程对此map进行操作,我们需要使用互斥锁。遵守RALL手法,初始化即上锁,销毁即解锁。这里用临时作用域让锁得颗粒度变小,保证性能。

2022-09-28 17:25:29 444

原创 (五)用户注册模块讲解

在用户注册模块,由函数处理业务。我们从传递过来的json对象中获取用户 ID 和用户密码。并用此信息初始化一个User对象,其初始状态设置为offline。之后调用 model 层代码与数据库交互,插入这个用户的信息。若成功则发出response信息,记得需要将信息序列化,。

2022-09-22 18:06:33 1069

原创 (四)model数据层设计

对应着 MySQL 里的表字段设计,我们创建 User 类。

2022-09-22 18:04:20 603

原创 (三)MySQL模块封装

项目需要使用 MySQL 模块连接数据库,并进行增删改查操作。这里使用的是 MySQL 提供的 C 语言接口。这里创建 MySQL 类将这些接口封装,向上层 model 层提供各种服务。我们会按照多层封装,如果在上层随意调用 SQL 语句,那么代码结构将是混乱的。而且如果以后更改数据库,基本全部重写。

2022-09-22 18:02:37 514 1

原创 (二)网络模块和业务模块解耦,编写ChatService

ChatServiec 负责解耦业务模块和网络模块,其内部保存了各个业务模块的handler(业务函数)。考虑其的唯一性,我们使用单例模式。

2022-09-22 18:01:13 591 1

原创 (一)使用muduo编写网络模块ChatServer

我们会使用 muduo 完成网络模块的代码,在这之前我们需要了解 muduo 的基本使用。muduo 的线程模型为「one loop per thread + threadPool」模型。一个线程对应一个事件循环(EventLoop),也对应着一个 Reactor 模型。EventLoop 负责 IO 和定时器事件的分派。其中有和subReactor。通过Acceptor接收新连接,然后将新连接派发到subReactor上进行连接的维护。这样可以只专注于监听新连接的到来,而从维护旧连接的业务中得到解放。

2022-09-22 18:00:20 1259

原创 JSON For Modern C++使用

JSON 其实就是一种约定好的数据表示形式。我们按照这种 JSON 格式发送字符串,对面再按照这种格式解析得到想要的信息。{怎么理解 JSON 的「序列化」和「反序列化」呢?所谓的序列化就是将对象的状态转换为可保持或者输出的格式的过程,反序列化,就是将流转换为对象。上面的 JSON 案例就是将某个 JSON 对象序列化的结果,反序列化就是将上面的 JSON 案例转换成一个 JSON 对象。然后我们可以从 JSON 对象中获取某个键值对。

2022-09-22 17:51:26 1093

原创 集群聊天服务器项目(C++ 11实现)

在 Linux 环境下基于 muduo 开发的集群聊天服务器。实现新用户注册、用户登录、添加好友、添加群组、好友通信、群组聊天、保持离线消息等功能。

2022-09-22 17:43:35 3555 1

原创 【muduo源码剖析】Buffer类的设计

Buffer源码剖析

2022-09-20 00:20:17 381

原创 【muduo源码剖析】Thread/ThreadPool源码解析

Thread/ThreadPool源码解析

2022-09-20 00:08:58 441

原创 【muduo源码剖析】EventLoop设计分析

muduo中事件循环的核心类EventLoop的源码剖析

2022-09-20 00:05:15 314

原创 【muduo源码剖析】Poller/EPollPoller设计分析

muduo关于Poller/EPollPoller类的源码剖析

2022-09-14 01:46:10 254

原创 【muduo源码剖析】Channel设计分析

muduo库的Channel类解析

2022-09-14 00:54:29 628

原创 vscode 远程连接错误:Server status check failed - waiting and retrying

vscode远程连接错误解决方法

2022-06-21 00:33:50 3058 3

原创 CLion安装下载

MinGW的下载安装

2022-06-21 00:32:31 1768

原创 MinGW下载安装

MinGW(全称为 Minimalist GNU for Windows),它实际上是将经典的开源 C 语言编译器 GCC 移植到了 Windows 平台下,并且包含了 Win32 API ,因此可以将源代码编译为可在 Windows 中运行的可执行程序。这里将讲述如何下载安装...

2022-06-21 00:31:11 9076 2

原创 Go语言使用JWT

Go语言使用JWT

2022-06-07 23:32:59 1010

原创 Go语言使用zap日志库

Go语言使用zap日志库

2022-06-07 23:31:37 1307

原创 错误:note: module requires Go 1.17

安装GO语言

2022-06-05 02:25:57 11140

原创 Golang Viper库入门教学

本文主要介绍Go语言项目中如何使用Viper来管理配置信息

2022-06-03 02:23:13 612

原创 Centos下载 NASM

Centos下载 NASMyum install nasm使用创建 hello.asm 文件touch hello.asm编辑 hello.asm 文件gedit hello.asmsection .data hello: db 'Hello world!',10 ; 'Hello world!' plus a linefeed character helloLen: equ $-hello ; Length of the 'Hello

2022-05-30 22:47:12 851

原创 Xshell下载安装(解决评估过期问题)

Xhell 下载安装这里使用的是免费版本的 Xshell,之前下载的时候不知道为什么提示 Xshell 的评估期已经过了,估计是下载的时候没有下载免费版本下面给出免费下载的地址家庭/学校免费 - NetSarang Website (xshell.com)在下方填好姓名邮箱后,会收到邮件,里面有下载链接点击后即可下载可以看到安装成功了,可以成功运行...

2022-05-30 18:55:49 683

原创 什么是数据库连接池

什么是数据库连接池应用程序和数据库建立连接的过程是这样的:通过 TCP 协议的三次握手和数据库服务器建立连接,然后发送数据库用户的账号密码,等待数据库验证身份验证通过后,我们可以提交 SQL 语句到数据库执行如果不使用数据库连接池的话,我们每完成一次SQL查询,就需要关闭一次连接。这个涉及到 TCP 的四次挥手。我们每使用一次SQL语句查询都需要创建连接,验证用户身份,然后操作结束后又主动关闭连接。这一系列操作耽误了时间。合理的做法就应该是系统启动的时候就创建数据库连接,然后需要使用SQL查

2022-05-15 16:35:38 228

原创 GOPATH,go vendor,go mod解析

GOPATH早期Go语言使用GOPATH来进行依赖管理。安装Go语言之后,我们需要配置环境变量,GOROOT,GOPATH。GOROOT代表Go语言的安装目录,GOPATH代表你的工作路径。GOPATH下的目录结构– bin 存放编译后生成的二进制可执行文件– pkg 存放编译后生成的 .a 文件– src 存放项目的源代码,可以是你自己写的代码,也可以是你 go get 下载的包GOPATH├── bin├── pkg└── src ├── projectA ├──

2022-05-13 20:51:09 907

原创 Golang 解析JSON

什么是JSONJSON: JavaScript Object Notation(JavaScript 对象表示法)JSON 是存储和交换文本信息的语法,类似 XML。JSON 比 XML 更小、更快,更易解析。JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。简单来说,这种结构储存数据有许多优点,我们喜欢使

2022-05-08 22:39:06 1846

原创 Golang 单元测试

想要测试Go代码需要依赖go test命令,需注意如下事项在包目录内所有测试文件必须以_test.go结尾,go build不会把这些测试文件编译到最终的可执行文件中。在_test.go文件中,单元测试函数的名字须以TestXxxx的形式每个单元测试函数的参数必须为*testing.T,参数t用于报告测试是否失败以及日志信息。func TestAdd(t *testing.T) {}func TestSum(t *testing.T) {}testing.T参数的拥有的方法如下:func

2022-05-08 22:22:49 572

原创 (Go Web) 接受请求

Go Web 接收请求因为HTTP是一种无连接协议,通过这种协议发送给服务器的请求对服务器之前处理的请求一无所知,所以应用程序才会采取cookie的方式在客户端实现数据持久化,并以会话的方式在服务器上实现数据持久化。为了降低使用cookie和session的复杂性,Web应用框架通常会提供一个统一的接口,用于在连接直接提供持久化。对Go来说,隐藏在框架下的通常是net/http和html/template库启动Web服务器最简单的 Web 服务器package mainimport ( "n

2022-05-06 16:56:14 375

原创 Golang error解析

error是什么?// The error built-in interface type is the conventional interface for// representing an error condition, with the nil value representing no error.type error interface { Error() string}可以看到,error就是一个接口,其中包含Error() string方法。从Error()的返回值也可以推断

2022-05-06 12:45:19 267

转载 Ubuntu彻底卸载MySQL

基本照着这个老哥的来,他实在是太稳健了(203条消息) Ubuntu彻底卸载MySQL,彻底!亲测!_流楚丶格念的博客-CSDN博客_ubuntu卸载mysqlsudo rm /var/lib/mysql/ -R删除mysql的配置文件sudo rm /etc/mysql/ -R自动卸载mysql(包括server和client)sudo apt-get autoremove mysql* --purgesudo apt-get remove apparmor然后在终端中查看MyS

2022-05-04 00:33:54 14199 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除