集群聊天项目

news2024/12/24 3:29:55

不懂的一些东西

(const TcpConnectionPtr&)作为形参啥意思:接收一个常量引用,函数内部不允许修改该指针所指向的对象。

优势

1.网络层与业务层分离:通过网络层传来的id,设计一个map存储id以及对印的业务处理器,处理器bind绑定处理函数,直接分离根据id调用业务即可

2.这里传入的是user对象而不是sql语句,很方便4b6386f0ce7347cda0a3b08a6fec583c.png

概述

网络层---业务层---数据层

mudou库和libevent二选一

14df50f9088b413db6226c9ede228d83.png

57b308c8320045aeb2bf205e5d1ff68e.png

ffb577ea91524b9ab7b18433bf2aab20.png

JSON介绍

174c62fd6b704ca2a305ec7aea2f3210.png

63698c594edf4209aecc64231aa88c7a.png

b167400e1e8f4578923e278d1698dfae.png

2c025cbc0e444af59ab8d46a4aefeb8a.png

muduo网络库

cf78b66906684c74821c3e644ca4e61a.png

回声服务器

3e0d80f3f8924769b8cbcc600d96ca6a.png

8d85a76a8897415db79407354f85b936.png

a66bc95b5f7a4cb38e32e96e070e3b3d.png

8abd5d4ddb9140f1964e36da05eb7a99.png

a775ddc93bdf4f3aa92c6c5a7b93942e.png

客户端实现

9ffad64c7c224674aeebbdfe64be0efa.png

9a38a0781e7049ea85a72bd901395c74.png

muduo中的线程池做计算任务

e0992f5f81434bfd84fe4aed237a5726.png

moduo网络库的多线程模型

网络服务器模型

bae3f6ba12174942ac30bf6fe6fcbb8b.png

47218bcdd3a64903b8d951def785db9b.png

moduo中的reactor模型

26cda6d4649f4df294d6317e3ffcc05b.png

b891ba87d6694883bb22d54fd3c0a5a4.png

cmake

项目数据库以及表的设计

48781abdec5148cd80abe4d325414845.png

c4577c43d6bd4719b45dca84af647ccb.png

8e841250c9c544659296c7b0ede696fb.png

集群项目聊天工程目录创建

aa28edb736db40debe1ea92abdbbf800.png

22288d83833e4379ad9e8ec2ac737b8c.png

8cf5123f714e4ab8b7b9bc2861c5c7dc.png

b06763a7c8b1455f9313293d9ec94405.png

网络模块代码

0ef2b7233c184e528ffde6d5e7734f3c.png

f5283c52a47945b4aa58a86ff3911272.png

81d2699db1164d50a28eb34f4d21d06f.png

业务模块代码

885bbcae6478474c9dcbc26915ec7079.png

4ef475b5a3ec407d92db2e02b61cfb63.png

03ee6f2cd8dc4c70944260ebacd88be8.png

网络模块和业务模块解耦度降级

285c43c7af174770b14eb60bce7df528.png

7d9c19c48a244a49a179501dac082cc6.png

8d3e0712208b4ba78c494f43cc708dd1.png

网络模块分发业务事件回调操作功能测试

talent连接客户端发送json数据进行测试

093e946f62aa4cc5a39a3e2741d9ad8c.png

Mysql数据库代码封装

65358184c9174a78a380e0e0238900b2.png

dbe10f710a194435822191f8f00f36a1.png

1cf19a2fec4545d084185d776da0214a.png

Model数据层代码框架设计

1980c8a5681c421898f3d9630c962c3a.png

f16576e1394e4f81ac58b5facf9013b1.png

5e30e62c7c094eb8b1acbe82c8fac83f.png

c66c0d5b041a445ba14d4780bb645c0a.png

用户注册业务代码

3700e18a334f4bc0beab9f430c4a016c.png

9792189438d94148b7bbc1e0a164884b.png

6d5ed181403a4355bdb26f282fb09144.png

d7b91f7f8da44bf099622d62162dc344.png

客户端发送json数据,其中msgid是2,代表注册消息。

e5ed925e158648a28489f12b8b3ecbf5.png

流程分析:输入ip端口连接上服务器,启动chatserver,调用其中的注册链接回调,并通过loop.loop()进入事件循环这样TcpServer对象接收到消息时就会调用onMessage回调函数,客户端发送msgid,name,password,调用onMessage回调函数,根据msgid获取对应的事件处理器并运行,进而启动相应注册业务函数,取出发过来的name和password放到User对象中,调用Usermodel对象(专门用来操作数据库的)的插入数据库方法,设置一个json格式消息返回给客户端。

用户登录业务代码

090cf1e5d4cf4d78827478aa497625a0.png

496fed03084747958fc95bdce1c6bec8.png

0a4b612cd6394285beb837cceb7cd36f.png

da0e92878e5543bca415899a70fbfa05.png

4feeb4b81f8a4b0b8dc57c23c63c7892.png

b4785d70be264ffc974aee3968f6363a.png

测试输入8cf49e9b528c4daf9279e58d65dc4740.png

记录用户的连接信息以及线程安全问题

这里记录连接信息只是在本台服务器,不可跨服务器

1c6c455e1be44505a22abdc8502d4915.png

3f88f99d30ca4a2090bf0a0b6510a34d.png

客户端异常退出业务代码

1deaf02c1698489ba5a83cbbb4118414.png

72db71f21d344f13b2ea1e53739beb55.png

ed17abd1c01e486bae341a2eff9c2de6.png

即客户端调用quit操作断开连接时被调用

点对点聊天业务代码

9b499e9c898f4e89a4cafdd836e3f049.png

525f071568384c39b60861751c7b600b.png

4f94f3d742f749acb251b38b5e5b98d8.png

dcc1c9d44edf49e48602e33524373da6.png

测试代码:注册两个,开两个客户端登录,发消息

e8797712857a47f3935c0b33ad2ac379.png

离线消息业务代码实现

ac10bff22b7d41f7b85d759142425adb.png

4c0d7b23e4c047ce87d6df1d091d9e61.png

5332ad341227450da5e1a85720d53df6.png

8135c00545214693ab4f2f3a10ba6d44.png

871b3ad758b342a6bcd74fed1ec07e09.png

小总结:

这里服务器充当中间角色,A客户端给B客户端发消息,离线消息存储在服务器mysql中,B客户端登录后查询是否有离线消息,如果有就取出来发给他(这个操作是服务器到客户端的send方法)这里存储消息的userid代表要发给的人的id,别人登录也用这个id,正好依次查询数据库信息

78bea7bb43a0476994d950102d66bdec.png

服务器异常退出处理代码

ctrl+c退出,数据库不会把online变为offline

917e520a75fb47ca8478a18e60e5dea2.png

825d1433a5e845b7be859f749aeb0c84.png

01605e9a74014ee2ad1e5101c174061d.png

7478e218ad8f4e1fa9beeb8d9822bd4f.png

d32b4a288f7b4b59b4e9d3607485cf4e.png

添加好友业务

4f35f7227b4640d89909892a71c47e34.png

df8e24941eaf41df8e5ccc557275e1b8.png

30e0dc8f688b4d9cb0da18027f0e467d.png

33389d3c38aa40e59ea094819d2780f1.png

f7531009b735492b8af1c15a903f0087.png

a8f21e6614e64db39ed9e8786b65efb3.png

06069edbaecc46b0a797517817f35a6d.png

e3dd40c06d10435692f7afbe72ed18e0.png

40063e11feac4db19dae8c12b9bbb80b.png

30e9f2c9a68c4db3a1ab4c981b0d7e23.png

小总结

这里的逻辑是添加好友要输入自己的id和所添加的好友的id,下次登录后查询好友状态的操作逻辑是根据我输入我自己的id,在friend表(userid+friendid存储方式)中查询我的id有哪些friendid,根据friendid在全局User表中查询对应用户信息返回给登录的用户。

群组业务代码

f3bd7670963f4ab1b931c654081380e8.png

c13dd19fcf104a3c8eff42c89cca6aab.png

523c85c42c4a4f92bafbd58e5b9a67bd.png

ce5cfac5de1444549f6be8d03caac1a9.png

Group类包括了群组id,群名,群描述,和所有群组用户信息

073cb1652bd148bb8aba795be0ef2fb5.png

c86b4bc50ccd466abb6939395d9be4b3.png

创建群组:传入group,给allgroup插入组名和组描述,第17行什么意思?

加入群组:传入创建者(加入者)的id,要加入的组id,职位,这个职位可以设置变量,这里为了方便,直接给创建者设置为creator,后加的默认role。然后放到GroupUser表。

96b58c3802e445b8afe95006a34237f8.png

业务实操

187155514f6d4cafa6838bcb54d7a560.png

ecc70a4dab124a22bc9f6f0448047e32.png

查询用户所在组信息:在groupuser表利用自己的id查自己组的id,然后换到allgroup表查这个组的信息放入groupVec(里面是一个个group)

a804d2791efd402da04246a282453fef.png

查询群组的用户信息:上面得到了组信息,根据组id在groupuser表中筛选出加入了这个组的人id,利用人id与所有用户都在的user表匹配查出用户的详细信息。因为上面groupVec里面每个group先只放了群信息,还剩一个放群员信息变量没放东西,下面会把群员信息(groupuser)放入其中,group还是原来的group,所以最后还是return groupVec

e4a94aed437142139f58beb58636b609.png

业务实操:(groupVec嵌套了group的vector,group嵌套了groupuser的vector)函数最终返回的是群组信息和群组的用户信息,服务器的作用是当客户端登录后,服务器开始查询,先整合群id群名字等一个json,再利用函数返回值整个一个json(这里的getUsers函数借用了User方法因为他们是继承关系)

整合json逻辑:先放群组信息,再for循环整合群员信息这是一个大json,即大json是grpjson,放到一个vector中最后传入response

9c25ee0edf1c4790971ede420c83fa6e.png

给群里其他人发消息:输入自己的id在输入想发消息的群组id,根据groupid在groupuser表中查询是同一群成员id且id不等于自己的人id,因为只需要id不需要详细信息,所以无需像上面从user表中查信息,这里返回的是群友的id

e4bbfb3373a545c8a1baa7da4f7c8cc6.png

实战操作:

c7008687ea9341bfbed109b2b2129299.png

客户端开发1

集群服务器引入负载均衡器

40d8cff7192248b9bf077881501844c1.png

集群聊天服务器跨服务器通信

client1登录,想发消息给client2,如果能找到client2的connection,证明他们用的是一台服务器,否则,去查数据库看client2是否是online,如果在线,想办法吧消息转给client2所在的服务器,然后找到connection发给client2。

e00192c0c5da422bb9499f7739ab023e.png

ae77d102781947028ad20a5544bab3e4.png

c8a259bee6a2472bb72bf361ebc97cd6.png

nginx负载均衡

524cbfd4efd6455dbe5091e2c17c8225.png

让客户端去指定连接nginx然后会自动跳转到服务器

redis发布订阅代码

548e5081096c4ef88893fabb7318f633.png

4da8dc29d69049398183493fe384d8d9.png

2b5d76e4f67b4802a242f790e3985d38.png

01f5c4e0946440869af7b46adb64ef2e.png

6bdd65f16e1b4a6ebd833f8893fb0164.png

056041594af54f79abd0a72b6382531c.png

b35e4ca6ee0c4e139096d8f20746723b.png

39ce58d2849d4ee1adc330c70350bae8.png

2c75723a8fe74b6fbcc41e1307e709df.png

79aee33bed7845e99334af026cf80b48.png

295f385674b3462794e31c3502c9d52b.png

服务器支持redis跨服务器通信

1.a72dfe25b0684f219944d2fe57e9b778.png

2.

7030710f3ebb4f1ea2db51e600db9229.png

3.

c94152c9a89a4c6daff2fa1bd281038f.png

8b3188243eb5494798666513f7ec1614.png

4.不在发消息用户所在的这台服务器就去队列里发布

dbbf84d731d443fda8498c59c82265aa.png

5.

a74a5867caa8445ca0a27ea3627dc60c.png

6.回调函数由redis调用,收消息用户在哪登陆了,这台服务器就会收到订阅消息

f75466b80fa9495997c4c5a892896b6f.png

9c2dbe3acdd842bd802286a535fff847.png

总结:哪个用户登录这台服务器,服务器就会用你的id在redis注册一个管道channel

测试

71d88eaf0d43411cbbc11f4ef6df0ebb.png

d77c16af43aa4135a7242f9f9b25b342.png

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1452153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文件上传漏洞--Upload-labs--Pass01--前端绕过

一、前端绕过原理 通俗解释,我们将写有恶意代码的php后缀文件上传到网页,网页中的javascript代码会先对文件的后缀名进行检测,若检测到上传文件的后缀名为非法,则会进行alert警告。若想上传php后缀的文件,就要想办法对…

windows一开机一直循环:No Boot Device Found. Press any key to reboot the machine解决方法

一、长按F12 二、选择Settiings/General/Boot Sequence 三、选择UEFI模式, 四、选择下方APPLY 五、退出:

【Spring面试题】

目录 前言 1.Spring框架中的单例bean是线程安全的吗? 2.什么是AOP? 3.你们项目中有没有使用到AOP? 4.Spring中的事务是如何实现的? 5.Spring中事务失效的场景有哪些? 6.Spring的bean的生命周期。 7.Spring中的循环引用 8.构造方法…

Linux下解压tar.xz文件的命令

tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 ------------------------------------------ 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的…

机器学习入门--循环神经网络原理与实践

循环神经网络 循环神经网络(RNN)是一种在序列数据上表现出色的人工神经网络。相比于传统前馈神经网络,RNN更加适合处理时间序列数据,如音频信号、自然语言和股票价格等。本文将介绍RNN的基本数学原理、使用PyTorch和Scikit-Learn…

上位机图像处理和嵌入式模块部署(图像项目处理过程)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 对于一般的图像项目来说,图像处理只是工作当中的一部分。在整个项目处理的过程中有很多的内容需要处理,比如说了解需求、评…

信息安全技术基础知识

一、考点分布 信息安全基础(※※)信息加密解密技术(※※※)密钥管理技术(※※)访问控制及数字签名技术(※※※)信息安全的保障体系 二、信息安全基础 信息安全包括5个基本要素&#…

【COMP337 LEC3】

LEC 3 Mathematical Preliminaries Common Discrete Probability Distributions 1. Bernoulli distribution : 伯努利分布 models binary outcomes (coin flip). 模型二进制结果 P ( X head ) p and P ( X tail ) 1 − p 2. Generalised Bernoulli distribution…

牛客网SQL进阶123:高难度试卷的得分的截断平均值

官网链接: SQL类别高难度试卷得分的截断平均值_牛客题霸_牛客网牛客的运营同学想要查看大家在SQL类别中高难度试卷的得分情况。 请你帮她从exam_。题目来自【牛客题霸】https://www.nowcoder.com/practice/a690f76a718242fd80757115d305be45?tpId240&tqId2180…

《PCI Express体系结构导读》随记 —— 第II篇 第13章 PCI总线与虚拟化技术(6)

接前一篇文章:《PCI Express体系结构导读》随记 —— 第II篇 第13章 PCI总线与虚拟化技术(5) 13.2 ATS(Address Translation Services) 单纯使用IOMMU并不能充分发挥处理器系统的效率,从图13-2中可以发现&…

WordPress站点如何实现发布文章即主动推送到百度快速收录和普通收录?

我们在WordPress后台成功发布文章之后,如果靠搜索引擎来抓取的话,可能会比较慢,所以十分有必要将我们成功发布的文章马上提交到百度、必应等搜索引擎中。下面boke112百科就跟大家说一说WordPress站点如何实现发布文章即主动推送到百度快速收录…

基于SpringBoot的教学管理app的开发65449-计算机毕业设计项目选题推荐(附源码)

摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对教学管理等问题,对其进行研究分…

Electron实战之进程间通信

进程间通信(IPC)并非仅限于 Electron,而是源自甚至早于 Unix 诞生的概念。尽管“进程间通信”这个术语的确创造于何时并不清楚,但将数据传递给另一个程序或进程的理念可以追溯至 1964 年,当时 Douglas McIlroy 在 Unix…

centos中docker操作+安装配置django+mysql5.7并使用simpleui美化管理后台

一、安装docker 确保系统是CentOS 7并且内核版本高于3.10,可以通过uname -r命令查看内核版本。 更新系统软件包到最新版本,可以使用命令yum update -y。 安装必要的软件包,包括yum-utils、device-mapper-persistent-data和lvm2。使用命令yum install -y yum-utils devic…

【51单片机】如何【手搓】定时器寄存器配置【低8位TL0(low)】和【高8位TH0(high)】

前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 本文是【【51单片机】从零开始手把手带你【查手册】配置定时器,并完成小项目(定时器&中断的应用)】博…

C++,stl,常用排序算法,常用拷贝和替换算法

目录 1.常用排序算法 sort random_shuffle merge reverse 2.常用拷贝和替换算法 copy replace replace_if swap 1.常用排序算法 sort 默认从小到大排序 #include<bits/stdc.h> using namespace std;int main() {vector<int> v;v.push_back(1);v.push_ba…

cpp杂项知识点(一)

大小端验证 代码如下&#xff1a; #include <iostream> #include <stdio.h> #include <memory> #include <string.h> #include <string>using namespace std;void hexdump(void *pSrc, int len ) {unsigned char *line;int i;int thisline;in…

Java的集合框架和泛型

文章目录 集合框架什么是集合框架类和接口总览 集合框架的重要性背后所涉及的数据结构以及算法什么是数据结构容器背后对应的数据结构什么是算法 包装类基本数据类型和对应的包装类装箱和拆箱自动装箱和自动拆箱 泛型什么是泛型引出泛型语法泛型类泛型的上界(没有下界)泛型方法…

Vue2学习第三天

Vue2 学习第三天 1. 计算属性 computed 计算属性实现 定义&#xff1a;要用的属性不存在&#xff0c;要通过已有属性计算得来。 原理&#xff1a;底层借助了Objcet.defineproperty方法提供的getter和setter。 get函数什么时候执行&#xff1f; 初次读取时会执行一次。当依赖…

知识图谱:py2neo将csv文件导入neo4j

文章目录 安装py2neo创建节点-连线关系图导入csv文件删除重复节点并连接边 安装py2neo 安装python中的neo4j操作库&#xff1a;pip install py2neo 安装py2neo后我们可以使用其中的函数对neo4j进行操作。 图数据库Neo4j中最重要的就是结点和边&#xff08;关系&#xff09;&a…