前言:学习一个基于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,可以使用以下命令查看自己的版本号:
cpp
lsb_release -a
使用是使用虚拟机安装Linux,推荐核心数4和内存4G,因为安装了接下来的工具,内存就很紧张。
5.2配置远程开发环境
当我们使用一台新安装的Linux系统时,需要开启sshd服务,以确保我们能够远程操作该系统。
- 首先安装并开启ssh
cpp
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库
cpp
tar xzvf boost_1_69_0.tar.gz
- 进入解压后的目录
cpp
cd /boost_1_69_0/
- 获取所需的库,主要的是boost::regex支持的icu
cpp
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引导程序设置
cpp
./bootstrap.sh --prefix=/usr/
执行:(比较耗时)
cpp
./b2
安装
cpp
sudo ./b2 install
- 测试Boost是否安装成功
cpp
#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库
cpp
unzip muduo-master.zip
- 进入该目录
cpp
cd muduo-master.zip
- 修改CMakeLists.txt第13行
- 安装cmake,然后编译安装muduo库
cpp
sudo apt-get install cmake
编译
cpp
./build.sh
安装muduo库
cpp
./build.sh install
- 把inlcude(头文件)和lib(库文件)目录下的文件拷贝到系统目录下
cpp
cd ../build/release-install-cpp11/include/
cpp
sudo mv ./muduo/ /usr/include/
cpp
cd ../lib/
cpp
sudo mv * /usr/local/lib/
- 测试安装成功
新建一个Muduo_text.cpp
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();
}
编译该文件
cpp
g++ Muduo_text.cpp -lmuduo_net -lmuduo_base -lpthread -std=c++11
新建一个终端,输入
cpp
echo "Hello world"|nc localhost 8888
结果如下则成功:
5.6安装Json
简介:Json是一种轻量级的数据交换格式(也叫数据序列化方式)。Json采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 Json 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
它只有一个hpp文件,需要时直接include就行,无需安装
cpp
#include "json.hpp"
using json = nlohmann::json;
5.7安装Redis
安装Redis可参考这篇博主的文章:Ubuntu中安装mysql和redis并配置远程连接
5.8安装Mysql
在Ubuntu中,默认情况下,只有最新版本的MySQL包含在APT软件包存储库中,要安装它,只需更新服务器上的包索引并安装默认包apt-get。
cpp
#命令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版本。
- 查看状态
cpp
/etc/init.d/mysql status
##或者使用(5.7第一次可能不能用)
systemctl status mysql.service
- 第一次登录需要sudo,然后修改密码,本文修改为123456:
cpp
sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
- 初始化mysql
cpp
mysql_secure_installation
- 登录
cpp
mysql -u root -p
- 查看是否安装成功
cpp
sudo netstat -tanp
出现mysqld说明配置成功
总结
本文简单介绍了该项目的内容、技术栈、需求和目标,然后着重介绍了环境的安装配置,有个别目前用不上,到后面再安装。希望本次环境安装能给大家一点帮主。