集群聊天服务器项目【C++】项目介绍和环境搭建
前言:学习一个基于C++集群聊天服务器的项目,记录学习的内容和学习的过程。
1.项目介绍
在 Linux 环境下基于 muduo 开发的集群聊天服务器。实现新用户注册、用户登录、添加好友、添加群组、好友通信、群组聊天、保持离线消息等功能。
2.技术栈
- Json序列化和反序列化
- muduo网络库开发
- nginx源码编译安装和环境部署
- nginx的tcp负载均衡器配置
- redis缓存服务器编程实践
- 基于发布-订阅的服务器中间件redis消息队列编程实践
- MySQL数据库编程
- CMake构建编译环境
- Github托管项目
3.项目需求
- 客户端新用户注册
- 客户端用户登录
- 添加好友和添加群组
- 好友聊天
- 群组聊天
- 离线消息
- nginx配置tcp负载均衡
- 集群聊天系统支持客户端跨服务器通信
4.项目目标
- 掌握服务器的网络I/O模块,业务模块,数据模块分层的设计思想
- 掌握C++ muduo网络库的编程以及实现原理
- 掌握Json的编程应用
- 掌握nginx配置部署tcp负载均衡器的应用以及原理
- 掌握服务器中间件的应用场景和基于发布-订阅的redis编程实践以及应用原理
- 掌握CMake构建自动化编译环境
- 掌握Github管理项目
5.开发环境
- ubuntu linux环境
- 安装Json开发库
- 安装boost +cmake+ muduo网络库
- 安装redis环境
- 安装mysql数据库环境
- 安装nginx
5.1安装Linux操作系统
可以选用Centos或者Ubuntu,本人使用Ubuntu 18.04,可以使用以下命令查看自己的版本号:
lsb_release -a
使用是使用虚拟机安装Linux,推荐核心数4和内存4G,因为安装了接下来的工具,内存就很紧张。
5.2配置远程开发环境
当我们使用一台新安装的Linux系统时,需要开启sshd服务,以确保我们能够远程操作该系统。
- 首先安装并开启ssh
sudo apt-get update //更新源
sudo apt-get install openssh-server //安装
netstat -tanp | grep sshd //查看是否开启sshd服务
注意:如果不能连上该服务器,可以查看下防火墙是否开启(本人曾租用的服务器上遇到过)
5.3安装muduo网络库
因为muduo库是基于Boost库开发的,所以先安装Boost库。
5.3.1安装Booost库
- 下载Boost库
- 到下载的目录解压Boost库
tar xzvf boost_1_69_0.tar.gz
- 进入解压后的目录
cd /boost_1_69_0/
- 获取所需的库,主要的是boost::regex支持的icu
sudo apt-get update
sudo apt-get install build-essential g++ python-dev autotools-dev libicu-dev build-essential libbz2-dev libboost-all-dev
- Boost引导程序设置
./bootstrap.sh --prefix=/usr/
执行:(比较耗时)
./b2
安装
sudo ./b2 install
- 测试Boost是否安装成功
#include <iostream>
#include <boost/bind.hpp>
#include <string>
using namespace std;class Hello{public:void say(string name){cout << name << "Nice to meet you!" << endl;}
};int main()
{Hello h;auto func=boost::bind(&Hello::say,&h,"Hey boy ");func();return 0;
}
g++编译后,运行后结果如下则安装成功:
5.3.2安装muduo库
一个基于reactor反应堆模型的多线程C++网络库。有个这个库,我们不需要自己写epoll和线程池了,因为muduo已经封装好了,它将IO模块和业务模块分开,我们主要考虑业务模块,IO模块完全由muduo库完成。
- 解压muduo库
unzip muduo-master.zip
- 进入该目录
cd muduo-master.zip
- 修改CMakeLists.txt第13行
- 安装cmake,然后编译安装muduo库
sudo apt-get install cmake
编译
./build.sh
安装muduo库
./build.sh install
- 把inlcude(头文件)和lib(库文件)目录下的文件拷贝到系统目录下
cd ../build/release-install-cpp11/include/
sudo mv ./muduo/ /usr/include/
cd ../lib/
sudo mv * /usr/local/lib/
- 测试安装成功
新建一个Muduo_text.cpp
#include <muduo/net/TcpServer.h>
#include <muduo/base/Logging.h>
#include <boost/bind.hpp>
#include <muduo/net/EventLoop.h>
// 使用muduo开发回显服务器
class EchoServer {
public:EchoServer(muduo::net::EventLoop* loop,const muduo::net::InetAddress& listenAddr);void start();
private:void onConnection(const muduo::net::TcpConnectionPtr& conn);void onMessage(const muduo::net::TcpConnectionPtr& conn,muduo::net::Buffer* buf,muduo::Timestamp time);muduo::net::TcpServer server_;
};
EchoServer::EchoServer(muduo::net::EventLoop* loop,const muduo::net::InetAddress& listenAddr): server_(loop, listenAddr, "EchoServer")
{server_.setConnectionCallback(boost::bind(&EchoServer::onConnection, this, _1));server_.setMessageCallback(boost::bind(&EchoServer::onMessage, this, _1, _2, _3));
}
void EchoServer::start()
{server_.start();
}
void EchoServer::onConnection(const muduo::net::TcpConnectionPtr& conn)
{ LOG_INFO << "EchoServer - " << conn->peerAddress().toIpPort() << " -> "<< conn->localAddress().toIpPort() << " is " << (conn->connected() ? "UP" : "DOWN");
}
void EchoServer::onMessage(const muduo::net::TcpConnectionPtr& conn,muduo::net::Buffer*buf,muduo::Timestamp time)
{// 接收到所有的消息,然后回显muduo::string msg(buf->retrieveAllAsString());LOG_INFO << conn->name() << " echo " << msg.size() << " bytes, "<< "data received at " << time.toString(); conn->send(msg);
}
int main()
{LOG_INFO << "pid = " << getpid();muduo::net::EventLoop loop;muduo::net::InetAddress listenAddr(8888);EchoServer server(&loop, listenAddr);server.start();loop.loop();
}
编译该文件
g++ Muduo_text.cpp -lmuduo_net -lmuduo_base -lpthread -std=c++11
新建一个终端,输入
echo "Hello world"|nc localhost 8888
结果如下则成功:
5.6安装Json
简介:Json是一种轻量级的数据交换格式(也叫数据序列化方式)。Json采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 Json 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
它只有一个hpp文件,需要时直接include就行,无需安装
#include "json.hpp"
using json = nlohmann::json;
5.7安装Redis
安装Redis可参考这篇博主的文章:Ubuntu中安装mysql和redis并配置远程连接
5.8安装Mysql
在Ubuntu中,默认情况下,只有最新版本的MySQL包含在APT软件包存储库中,要安装它,只需更新服务器上的包索引并安装默认包apt-get。
#命令1
sudo apt-get update
#命令2
sudo apt-get install mysql-server
## 安装MySQL编程开发包,这是ubuntu的包名,其它系统自行搜索
sudo apt-get install libmysqlclient-dev
ubuntu18.04默认安装mysql5.7,ubuntu20及以上默认安装8.0版本。
- 查看状态
/etc/init.d/mysql status
##或者使用(5.7第一次可能不能用)
systemctl status mysql.service
- 第一次登录需要sudo,然后修改密码,本文修改为123456:
sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
- 初始化mysql
mysql_secure_installation
- 登录
mysql -u root -p
- 查看是否安装成功
sudo netstat -tanp
出现mysqld说明配置成功
总结
本文简单介绍了该项目的内容、技术栈、需求和目标,然后着重介绍了环境的安装配置,有个别目前用不上,到后面再安装。希望本次环境安装能给大家一点帮主。
相关文章:

集群聊天服务器项目【C++】项目介绍和环境搭建
前言:学习一个基于C集群聊天服务器的项目,记录学习的内容和学习的过程。 1.项目介绍 在 Linux 环境下基于 muduo 开发的集群聊天服务器。实现新用户注册、用户登录、添加好友、添加群组、好友通信、群组聊天、保持离线消息等功能。 2.技术栈 Json序列…...
c++ #include <memory> 智能指针介绍
#include <memory> 是 C 标准库中的头文件,用于支持智能指针的功能。智能指针是现代 C 的一种资源管理工具,用于自动管理动态分配的内存,从而减少内存泄漏和悬挂指针等问题的发生。它提供了多种类型的智能指针,包括 std::un…...

32.递归、搜索、回溯之floodfill算法
0.简介 1.图像渲染 . - 力扣(LeetCode) 题目解析 算法原理 代码 class Solution {int[] dx { 0, 0, 1, -1 };int[] dy { 1, -1, 0, 0 };int m, n;int prev;public int[][] floodFill(int[][] image, int sr, int sc, int color) {if (image[sr][sc]…...
Vue3.5+ 响应式 Props 解构
你好同学,我是沐爸,欢迎点赞、收藏、评论和关注。 在 Vue 3.5 中,响应式 Props 解构已经稳定并默认启用。这意味着在 <script setup> 中从 defineProps 调用解构的变量现在是响应式的。这一改进大大简化了声明带有默认值的 props 的方…...
k8s中的认证授权
目录 一、kubernetes API 访问控制 1.1 UserAccount与ServiceAccount 1.1.1 ServiceAccount 1.1.2 ServiceAccount示例 二、认证(在k8s中建立认证用户) 2.1 创建UserAccount 2.2 RBAC(Role Based Access Control) 2.2.1 基于角色访问控制授权&…...
Leetcode 3291. Minimum Number of Valid Strings to Form Target I
Leetcode 3291. Minimum Number of Valid Strings to Form Target I 1. 解题思路2. 代码实现 题目链接:3291. Minimum Number of Valid Strings to Form Target I 1. 解题思路 这一题第一反应就是用一个字典树动态规划的方式,倒是也搞定了,…...
PostgreSQL的查看主从同步状态
PostgreSQL的查看主从同步状态 PostgreSQL 提供了一些系统视图和函数,查看和监控主从同步的状态。 1 在主节点上查看同步状态 pg_stat_replication 视图 在主节点上,可以通过查询 pg_stat_replication 视图来查看复制的详细状态信息,包括…...
Java多态性的理解
方法的覆盖 子类的方法重写了父类的方法,相当于对原来的方法进行了增强,接口就是这样的思想。 属性的隔离(Java中什么情况下都不会属性覆盖,python可能会覆盖) public class Main {public static void main(String[…...

安全工具 | 使用Burp Suite的10个小tips
Burp Suite 应用程序中有用功能的集合 img Burp Suite 是一款出色的分析工具,用于测试 Web 应用程序和系统的安全漏洞。它有很多很棒的功能可以在渗透测试中使用。您使用它的次数越多,您就越发现它的便利功能。 本文内容是我在测试期间学到并经常的主要…...
企业项目中字符串工具类
此工具类暂时包含如下功能: isEmpty()判断字符串是否为空subSpecifiedString()判断字符串是否超出指定长度,超出则截取到指定长度yearMonthToDate()将年月的字符串转成年月日格式 yearMonthToDateTime()将年月的字符串转成年月日时分秒格式 package co…...
下载github patch到本地
以下是几种从 GitHub 上下载以.patch 结尾的补丁文件的方法: 通过浏览器直接下载 打开包含该.patch 文件的 GitHub 仓库。在仓库的文件列表中找到对应的.patch 文件。点击该文件,浏览器会显示文件的内容,在页面的右上角通常会有一个“Raw”…...
C++基础部分代码
C OOP面对对象 this指针 C:各种各样的函数定义 struct C:类》实体的抽象类型 实体(属性,行为)-》ADT(abstract data type) OOP语言的四大特征是什么? 抽象 封装/隐藏 继承 多态 访问限定符:public公有的 private私有的…...

neo4j(spring) 使用示例
文章目录 前言一、neo4j是什么二、开始编码1. yml 配置2. crud 测试3. node relation 与java中对象的关系4. 编码测试 总结 前言 图数据库先驱者 neo4j:neo4j官网地址 可以选择桌面版安装等多种方式,我这里采用的是docker安装 直接执行docker安装命令: docker run…...

链接升级:Element UI <el-link> 的应用
链接升级:Element UI 的应用 一 . 创建文字链接1.1 注册路由1.2 创建文字链接 二 . 文字链接的属性2.1 文字链接的颜色2.2 是否显示下划线2.3 是否禁用状态2.4 填写跳转地址2.5 加入图标 在本篇文章中,我们将深入探索Element UI中的<el-link>组件—…...

简单题26 - 删除有序数组中的重复项(Java)20240917
问题描述: java代码: class Solution {public int removeDuplicates(int[] nums) {if (nums.length 0) return 0; // 处理空数组情况int i 0; // 指向新数组中的最后一个不重复元素for (int j 1; j < nums.length; j) {if (nums[j] ! nums[i]) { …...

DFS:深搜+回溯+剪枝实战解决OJ问题
✨✨✨学习的道路很枯燥,希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一 排列、子集问题 1.1 全排列I 1.2 子集I 1.3 找出所有子集的异或总和 1.4 全排列II 1.5 字母大小写全排列 1.6 优美的排列 二 组合问题 2.1 电话号码的数字组合 …...

命令语境中的“可以”的字词含义分析
摘要 在语言交流中,词汇的使用经常受到语境的影响。本文探讨了“可以”一词在上司与下属之间的互动中所表达的命令含义。通过分析语料和实例,发现“可以”在某些情况下并不传达许可的含义,而是被用作一种隐性命令。本文讨论了这一现象的成因…...
直播相关03-录制麦克风声音, ffmpeg 命名,使用命令行完成录音
一 ffmpeg 命令 ffmpeg arg1 arg2 -i arg3 arg4 arg5ffmpeg 全局参数 输入文件参数 -i 输入文件 输出文件参数 输出文件arg1:全局参数 arg2:输入文件参数 arg3:输入文件 arg4:输出文件参数 arg5:输出文件 二 ffprobe …...
VUE3中ref与reactive
ref:支持所有类型reactive:只支持引用类型(Obj,Array...)两者都是实现数据视图响应式 JS逻辑使用中 ref:需要使用.value reactive:不需要使用.value <el-button click"handle()" type"primary"…...

高职院校人工智能技术和无人机技术实训室建设方案
一、方案背景与需求分析 1.1 人工智能与无人机技术发展概况 人工智能(AI)和无人机技术作为当今科技领域的两大热点,正以前所未有的速度发展和渗透到各行各业中。根据国际数据公司(IDC)的报告,全球人工智能市场规模预计将在2024年…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...