首页 > 其他分享 >集群聊天服务器与客户端开发

集群聊天服务器与客户端开发

时间:2024-03-27 17:37:32浏览次数:38  
标签:redis sponge 集群 plus mysql 服务器 path 客户端

服务器

服务器代码在https://gitee.com/ericling666/sponge,对应的客户端源代码在https://gitee.com/ericling666/spongeclient

对本项目的演示,请看视频【集群聊天服务器与仿微信客户端开发,服务器基于muduo,mysql,redis,客户端基于Qt6和FluentUI,代码已开源】

服务器可用于本地部署,也可以部署到云端,使用docker compose一行代码就能部署所有服务,主要有以下服务:
img
详细的配置信息见docker compose文件。

服务

  • mysql,端口均是3306,方便数据库客户端直连。
  • nginx,端口是8000,反向代理了三个服务节点server1、server2、server3。
  • redis,端口是6379,方便redis客户端直连。
  • server1、server2、server3随机端口,容器内部分别指定为8001、8002、8003,还可以任意添加多个sponge server服务,然后用nginx做负载均衡,这里仅配置了三台。

技术特点

  • 采用tcp长连接实现数据通信,消息传递直接通过目标用户的tcp长链接发到客户端。
  • 对于不在同一台服务器上的两个用户之间的通信,使用redis的发布订阅功能实现消息的转发。redis的connector是redis-plus-plus,对redis的连接实现了一个连接池,见redisconnectionpool.h
  • 支持离线消息,把离线消息存储到mysql数据库中,对mysql数据库的连接,实现了一个数据库连接池mysqlconnectionpool
  • 使用muduo网络库实现网络通信。
  • 使用json解析数据,有自定义的应用层协议字段。
  • 使用dockerfile快速构建镜像,对第三方依赖通过git submodule实现版本控制和依赖管理,方便部署。
  • 使用nginx实现传输层反向代理、负载均衡,所有服务通过docker compose直接启动,方便管理和维护。
  • 使用cmake构建,没有使用平台特定的API, 依赖库也都是跨平台的,因此,理论上,支持windows、mac、linux,但是仅在linux上测试过。
  • 实现了一个线程安全的异步日志工具类,见logger.h,对INFO和ERROR两种日志类型分别输出到文件和终端。

如何使用

有两种部署方式,一种是仅编译spongeserver服务,然后其它服务使用本地安装或者docker容器,另一种办法则是全部用docker部署,只需要使用docker compose一行代码就能启动所有容器。

第一种办法,可以参考dockerfile文件给出的编译命令,以下简单给出命令和说明。

# 下载本仓库,必须带上--recursive,这样会自动克隆muduo,hiredis,redis-plus-plus这几个子模块
git clone --recursive https://gitee.com/ericling666/sponge


sudo apt update
# 安装mysql的connector
sudo apt install libmysqlcppconn-dev

# 编译、安装muduo网络库
mkdir -p /path to sponge/dependencies/muduo/build
cd /path to sponge/dependencies/muduo/build
cmake -DMUDUO_BUILD_EXAMPLES=OFF ..
make -j4
sudo make install

# 编译、安装hiredis库
mkdir -p /path to sponge/dependencies/hiredis/build
cd /path to sponge/dependencies/hiredis/build
cmake ..
make -j4
sudo make install

# 编译、安装redis-plus-plus库
mkdir -p /path to sponge/dependencies/redis-plus-plus/build
cd /path to sponge/dependencies/redis-plus-plus/build
cmake -DREDIS_PLUS_PLUS_CXX_STANDARD=11 -DREDIS_PLUS_PLUS_BUILD_STATIC=OFF -DREDIS_PLUS_PLUS_BUILD_TEST=OFF ..
make -j4
sudo make install

# 编译 sponge server
mkdir -p /path to sponge/build
cd /path to sponge/build
cmake -DCMAKE_BUILD_TYPE=release -DSPONGE_DISABLE_EXAMPLES=ON -DSPONGE_DISABLE_TESTS=ON ..
make -j4

# 修改mysql和redis的ip地址,(端口号如果不一致也要相应修改),这里是把localhost修改为$mysql和$redis,你需要把$mysql、$redis修改为对应的ip地址
sed -i 's/localhost/$mysql/g' /path to sponge/bin/mysql.cnf
sed -i 's/localhost/$redis/g' /path to sponge/bin/redis.cnf

cd /path to sponge/bin
# 启动server进程,监听8000端口
./server 0.0.0.0 8000

此外,还需要导入数据库表,导入脚本见文件sponge.sql

nginx的配置见文件nginx.conf和文件sponge.conf

第一种办法,相对麻烦,推荐第二种办法,命令如下,视频中演示的也是这种方案,可以快速部署,上云。

# 下载本仓库,必须带上--recursive,这样会自动克隆muduo,hiredis,redis-plus-plus这几个子模块
git clone --recursive https://gitee.com/ericling666/sponge

# 启动所有服务,这会下载mysql、redis、nginx等镜像,并且下载ubuntu镜像,用于构建sponge server镜像,构建脚本见dockerfile文件
docker compose up -d

服务器启动之后,可以通过nc <ip> <port>快速验证是否启动成功
img

你还可以输入以下json格式的字符串,而不需要客户端,直接与服务器通信:

// 用户登录
{"msgType":1, "USERID":6, "password":"6"}
// 注册用户
{"msgType":2, "name":"Eric Ling", "password":"whatever"}
// 退出登录
{"msgType":3, "USERID":7}
// 用户聊天
{"msgType":4,"FROMID":6,"TOID":8,"msg":"你好 8号","sendTime":1703078264002}
// 添加好友
{"msgType":6,"U1":1,"U2":2}
// 查找好友
{"msgType":8,"FROMID":6}
// 群聊消息
{"msgType":9,"FROMID":6,"GROUPID":8,"msg":"你好 8号","sendTime":1703078264002}
// 加入群聊
{"msgType":10,"FROMID":6,"GROUPID":7}
// 创建群聊
{"msgType":12,"FROMID":6,"name":"cpp","description":"cpp group."}
// 查询离线消息
{"msgType":14,"FROMID":1}
// 查询账号
{"msgType":15,"keyword":"1"}

依赖库

其中libmysqlcppconn-dev是通过apt直接安装的,json库是header only,其它三个库都是从源码构建的

客户端

页面参考了https://github.com/zhuzichu520/kim-qt的代码,该项目是FluentUI的作者编写的,仅开源了客户端的代码,使用的是websocket,服务端使用netty和java实现。

本项目的客户端基本仿照他的kim-qt代码实现的。
客户端的编译,需要用到Qt6,在windows和linux mint中都编译过,仅测试过6.2.4和6.6.2两个版本,其它Qt6的版本应该也可以,没有试过Qt5版本

首先下载本仓库

git clone https://gitee.com/ericling666/spongeclient

克隆到本地之后,还需要下载依赖库,在spongeclient目录下执行以下命令

git clone https://github.com/zhuzichu520/fluentui

然后用qt creator打开, 进行编译即可

在首次使用时,需要在设置中修改服务器的ip地址和端口号

当然也可以在配置文件中修改

标签:redis,sponge,集群,plus,mysql,服务器,path,客户端
From: https://www.cnblogs.com/ericling0529/p/18099800

相关文章

  • Linux - 搭建一套Apache大数据集群
     一、服务器操作系统主机名操作系统node01Centos7.9node02Centos7.9node03Centot7.9 二、大数据服务版本服务版本下载Zookeeper3.5.7DownloadHadoop3.3.6DownloadHive3.xDownloadHbase2.xDownloadSpark3.xDownload......
  • 【2G 50元/年 4G 618/3年!】支持比价必赔 送抽奖机会 京东云服务器推荐 附阿里云 腾讯
     《最新对比表》已更新在文章头部—腾讯云文档,文章具有时效性,请以腾讯文档为准!【腾讯文档实时更新】云服务器1分钟教会你如何选择教程https://docs.qq.com/document/DV0RCS0lGeHdMTFFV?tab=000003​当前活动:采购季,各厂商活动已更新,适用于博客建站(2-4G)、小型游戏(4-8G)、大......
  • 安全更新:关于Cybellum维护服务器问题的情况说明(CVE-2023-42419)
    “转载自CybellumTechnologiesLtd.”我们想通知我们的客户一个我们注意到的安全问题,作为我们对产品透明度和持续安全性的承诺。2023年6月21日,一位名叫Delikely的安全研究员向Cybellum的安全团队报告了一个问题,特别针对Cybellum软件的某个发行版。这个问题是在Cybellum的QCOW......
  • 从入门到精通:GPS北斗卫星校时服务器 操作指南
    从入门到精通:GPS北斗卫星校时服务器操作指南从入门到精通:GPS北斗卫星校时服务器操作指南京准电子科技官微——ahjzsz一、产品功能卫星时钟服务器是一款采用GPS或北斗卫星提供高精度网络时间服务的产品。卫星天线安装简便(根据天线所放位置提示实时卫星颗数),接口可支持以太网1......
  • Zookeeper客户端java API
    ZooKeeper是一个开源的分布式协调服务,它为分布式应用提供了简单的原语来管理分布式系统中的协调问题,如命名、配置管理、同步和组服务等。ZooKeeper的API为客户端提供了与ZooKeeper服务交互的方式。下面我们将介绍ZooKeeper的主要API及其功能。主要API功能列表:create创建......
  • SpringBootWeb最新相关技术(上接maven):IDEA2023-Spring环境,http协议复习概览,web服务器To
    Spring官网HTTPs://spring.iospring生态(全家桶)基于SpringFramework基础框架。但如果我们基于该基础框架开发,会面临配置繁琐,入门难度大的问题,SpringBoot则可以快速开发(简化配置,快速开发)。1.SpringBootWeb入门使用SpringBoot开发一个Web应用,浏览器发起请求/hello之后,给浏......
  • 一套集群实时在线扩容为两套集群方案
    一套集群实时在线扩容为两套集群方案解决问题:当一套集群A承担不了业务压力,需要在A集群在线情况下,扩出来一套与A集群完全一样的B集群,之后从业务层面控制A和B各自承担原A承担的一半业务压力。1、配置A集群1.1A集群创建用户并赋权selectfrompg_userwhere;......
  • 使用K8S集群运行MongoDB7.0
    参考:https://hub.docker.com/_/mongo创建PVC创建PVC用于数据持久化#catmongodb-pvc.yamlapiVersion:v1kind:PersistentVolumeClaimmetadata:name:mongodb-pvcspec:accessModes:-ReadWriteOnceresources:requests:storage:22Gistorag......
  • 关于AWS-EFS-跨VPC及跨账号-客户端的挂载方法-注意事项
    关于EFS客户端挂载EFS的方式,可以参考笔者的另一篇文件《使用EFS客户端帮助程序-对AWS-EFS-访问点-Access-points-的挂载》但这是对于同一个VPC中EC2,可以直接简单的使用那样的方式进行挂载如果是不同的VPC之间或者跨账号,应该如何挂载呢?当然这里假定网络的连接都已经打通首先,我们......
  • 服务器运维新手的第一台服务器学习教程
    目前刚接触服务器这一块的学习,这里记录一下解如何获取自己的第一台虚拟云服务器,给刚入行服务器开发的小伙伴做一个参考。具体的步骤如下:一、服务器的注册和获取1、打开bwg88服务器平台地址:点击进入https://bwh88.net/aff.php?aff=743202、进入到官网界面后如下图:3、点击注......