经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
[代码已开源]集群聊天服务器与客户端开发
来源:cnblogs  作者:EricLing0529  时间:2024/3/29 8:49:43  对本文有异议

服务器

服务器代码在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文件给出的编译命令,以下简单给出命令和说明。

  1. # 下载本仓库,必须带上--recursive,这样会自动克隆muduo,hiredis,redis-plus-plus这几个子模块
  2. git clone --recursive https://gitee.com/ericling666/sponge
  3. sudo apt update
  4. # 安装mysql的connector
  5. sudo apt install libmysqlcppconn-dev
  6. # 编译、安装muduo网络库
  7. mkdir -p /path to sponge/dependencies/muduo/build
  8. cd /path to sponge/dependencies/muduo/build
  9. cmake -DMUDUO_BUILD_EXAMPLES=OFF ..
  10. make -j4
  11. sudo make install
  12. # 编译、安装hiredis库
  13. mkdir -p /path to sponge/dependencies/hiredis/build
  14. cd /path to sponge/dependencies/hiredis/build
  15. cmake ..
  16. make -j4
  17. sudo make install
  18. # 编译、安装redis-plus-plus库
  19. mkdir -p /path to sponge/dependencies/redis-plus-plus/build
  20. cd /path to sponge/dependencies/redis-plus-plus/build
  21. cmake -DREDIS_PLUS_PLUS_CXX_STANDARD=11 -DREDIS_PLUS_PLUS_BUILD_STATIC=OFF -DREDIS_PLUS_PLUS_BUILD_TEST=OFF ..
  22. make -j4
  23. sudo make install
  24. # 编译 sponge server
  25. mkdir -p /path to sponge/build
  26. cd /path to sponge/build
  27. cmake -DCMAKE_BUILD_TYPE=release -DSPONGE_DISABLE_EXAMPLES=ON -DSPONGE_DISABLE_TESTS=ON ..
  28. make -j4
  29. # 修改mysql和redis的ip地址,(端口号如果不一致也要相应修改),这里是把localhost修改为$mysql和$redis,你需要把$mysql、$redis修改为对应的ip地址
  30. sed -i 's/localhost/$mysql/g' /path to sponge/bin/mysql.cnf
  31. sed -i 's/localhost/$redis/g' /path to sponge/bin/redis.cnf
  32. cd /path to sponge/bin
  33. # 启动server进程,监听8000端口
  34. ./server 0.0.0.0 8000

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

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

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

  1. # 下载本仓库,必须带上--recursive,这样会自动克隆muduo,hiredis,redis-plus-plus这几个子模块
  2. git clone --recursive https://gitee.com/ericling666/sponge
  3. # 启动所有服务,这会下载mysql、redis、nginx等镜像,并且下载ubuntu镜像,用于构建sponge server镜像,构建脚本见dockerfile文件
  4. docker compose up -d

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

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

  1. // 用户登录
  2. {"msgType":1, "USERID":6, "password":"6"}
  3. // 注册用户
  4. {"msgType":2, "name":"Eric Ling", "password":"whatever"}
  5. // 退出登录
  6. {"msgType":3, "USERID":7}
  7. // 用户聊天
  8. {"msgType":4,"FROMID":6,"TOID":8,"msg":"你好 8号","sendTime":1703078264002}
  9. // 添加好友
  10. {"msgType":6,"U1":1,"U2":2}
  11. // 查找好友
  12. {"msgType":8,"FROMID":6}
  13. // 群聊消息
  14. {"msgType":9,"FROMID":6,"GROUPID":8,"msg":"你好 8号","sendTime":1703078264002}
  15. // 加入群聊
  16. {"msgType":10,"FROMID":6,"GROUPID":7}
  17. // 创建群聊
  18. {"msgType":12,"FROMID":6,"name":"cpp","description":"cpp group."}
  19. // 查询离线消息
  20. {"msgType":14,"FROMID":1}
  21. // 查询账号
  22. {"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版本

首先下载本仓库

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

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

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

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

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

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

原文链接:https://www.cnblogs.com/ericling0529/p/18099800

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号