集群聊天项目

不懂的一些东西

(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.mzph.cn/news/685558.shtml

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

相关文章

mysql 2-16

安全等于<> 最大最小LEAST,GREATEST BETWEEN AND 条件一是下限 IN LIKE关键字 转移字符 逻辑运算符 位运算符 排序数据 升序降序&#xff0c;默认升序 二级排序 8.0新特性 小拓展 多表查询 多表查询 别名 多表查询的分类 非等值连接 自连接 内连接与外连接 sql92实现外连…

TenorFlow多层感知机识别手写体

文章目录 数据准备建立模型建立输入层 x建立隐藏层h1建立隐藏层h2建立输出层 定义训练方式建立训练数据label真实值 placeholder定义loss function选择optimizer 定义评估模型的准确率计算每一项数据是否正确预测将计算预测正确结果&#xff0c;加总平均 开始训练画出误差执行结…

【超级干货】ArcGIS_空间连接_工具详解

帮助里对空间连接的解释&#xff1a; 根据空间关系将一个要素的属性连接到另一个要素。 目标要素和来自连接要素的被连接属性写入到输出要素类。 如上图所示&#xff0c;关键在于空间关系&#xff0c;只有当两个要素存在空间关系的时候&#xff0c;空间连接才有用武之地。 一…

JavaScript_00001_00000

contents 简介变量与数据类型自动类型转换强制类型转换 简介 变量与数据类型 根据变量定义的范围不同&#xff0c;变量有全局变量和局部变量之分。直接定义的变量是全局变量&#xff0c;全局变量可以被所有的脚本访问&#xff1b;在函数里定义的变量称为局部变量&#xff0c;…

JavaWeb之Servlet接口

Servlet接口 什么是Servlet&#xff1f; Servlet是一种基于Java技术的Web组件&#xff0c;用于生成动态内容&#xff0c;由容器管理&#xff0c;是平台无关的Java类组成&#xff0c;并且由Java Web服务器加载执行&#xff0c;是Web容器的最基本组成单元 什么是Servlet容器&…

【c++】list详细讲解

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟悉list库 > 毒鸡汤&#xff1a;你的脸上云淡…

关于Build Your Own Botnet的尝试

这是一次失败的尝试、 原文地址&#xff1a;关于Build Your Own Botnet的尝试 - Pleasure的博客 下面是正文内容&#xff1a; 前言 我在上一篇关于DDOS的文章种提到过这个项目&#xff0c;而且说明了由于这个项目是在2020年发布并开源的&#xff0c;并且已经有两年没有进行跟…

身份治理存在权限问题

身份治理正迅速成为 CISO 的首要考虑因素。二十年前&#xff0c;当萨班斯-奥克斯利法案(SoX) 和其他监管指令在互联网泡沫破灭后诞生时&#xff0c;身份治理要求就出现了。合规性控制&#xff0c;例如用户访问审查和有效管理员工访问生命周期的需要&#xff0c;是当时身份治理的…

1.2.1 相机模型—内参、外参

相机模型-内参、外参 更多内容&#xff0c;请关注&#xff1a; github&#xff1a;https://github.com/gotonote/Autopilot-Notes.git&#xff09; 针孔相机模型&#xff0c;包含四个坐标系&#xff1a;物理成像坐标系、像素坐标系、相机坐标系、世界坐标系。 相机参数包含&…

typescript类型详解

因为介绍了ts的全部类型,所以比较长,各位可以通过目录选择性观看 typescript类型概述typescript 类型注解概念-->监测类型变化 ts类型注解语法ts常用类型原始类型对象类型对象类型_数组类型 ts新增,联合类型ts函数类型ts 函数类型 voidts 函数类型可选参数 ts 对象类型ts 可…

The method toList() is undefined for the type Stream

The method toList() is undefined for the type Stream &#xff08;JDK16&#xff09; default List<T> toList() { return (List<T>) Collections.unmodifiableList(new ArrayList<>(Arrays.asList(this.toArray()))); }

OpenAI Sora 初体验

OpenAI Sora 初体验 就在刚刚&#xff0c;OpenAI 再次投下一枚重磅炸弹——Sora&#xff0c;一个文本到视频生成模型。 我第一时间体验了 Sora。看过 Sora 的能力后&#xff0c;我真的印象深刻。对细节的关注、无缝的角色刻画以及生成视频的绝对质量真正将可能性提升到了一个新…

人工智能学习与实训笔记(五):神经网络之推荐系统处理

目录 ​​​​​​​七、智能推荐系统处理 7.1 常用的推荐系统算法 7.2 如何实现推荐​​​​​​​ 7.3 基于飞桨实现的电影推荐模型 7.3.1 电影数据类型 7.3.2 数据处理 7.3.4 数据读取器 7.3.4 网络构建 7.3.4.1用户特征提取 7.3.4.2 电影特征提取 7.3.4.3 相似度…

一周学会Django5 Python Web开发-Django5应用配置

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计14条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

SpringBoot+Tess4J实现本地与远程图片的文字识别

Spring Boot应用程序里集成Tess4J来实现OCR&#xff08;光学字符识别&#xff09;&#xff0c;以识别出本地和远程图片中的文字 一、添加依赖 <dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><vers…

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

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

通过写代码学习AWS DynamoDB (3)- 一致性hash

简介 在本文中&#xff0c;我们将简单介绍一致性hash&#xff08;consistent hash&#xff09;的概念&#xff0c;以及一致性hash可以解决的问题。然后我们将在模拟的DDB实现中实现一个简单版本的基于一致性harsh实现的partition。 问题 在《通过写代码学习AWS DynamoDB &am…

嵌入式——Flash(W25Q64)

目录 一、初识W25Q64 1. 基本认识 2. 引脚介绍 ​编辑 二、W25Q64特性 1. SPI模式 2. 双输出SPI方式 三、状态寄存器 1. BUSY位 2. WEL位 3. BP2、BP1、 BP0位 4. TB位 5. 保留位 6. SRP位 四、常用操作指令 1. 写使能指令&#xff08;06h&#xff09; 2. 写禁…

react【三】受控组件/高阶组件/portals/fragment/严格模式/动画

文章目录 1、受控组件1.1 认识受控组件1.2 checkout1.3 selected1.4 非受控组件 2、高阶组件2.1 认识高阶组件2.2 应用1-props增强的基本使用2.3 对象增强的应用场景-context共享2.4 应用2-鉴权2.5 应用3 – 生命周期劫持2.6、高阶组件的意义 3、Portals4、fragment5、StrictMo…

交大论文下载器

原作者地址&#xff1a; https://github.com/olixu/SJTU_Thesis_Crawler 问题&#xff1a; http://thesis.lib.sjtu.edu.cn/的学位论文下载系统&#xff0c;该版权保护系统用起来很不方便&#xff0c;加载起来非常慢&#xff0c;所以该下载器实现将网页上的每一页的图片合并…