集群聊天项目

不懂的一些东西

(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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云计算基础-计算虚拟化-CPU虚拟化

CPU指令系统 在CPU的工作原理中,CPU有不同的指令集,如下图,CPU有4各指令集:Ring0-3,指令集是在服务器上运行的所有命令,最终都会在CPU上执行,但是CPU并不是说所有的命令都是一视同仁的&#xf…

vscode写MATLAB配置

vscode写MATLAB python下载 官网说明Versions of Python Compatible with MATLAB Products by Release - MATLAB & Simulink 不确定这三列都表示什么意思,尽量安装这三列都有的python版本吧,我安装的 MATLAB R2023b,python选择的是3.11.5 …

Midjourney绘图欣赏系列(四)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子,它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同,Midjourney 是自筹资金且闭源的,因此确切了解其幕后内容尚不…

2.13:C语言测试题

21.(b) 6 22.(b) cd 23.b) 5 4 1 3 2 栈:先进后出 24. b,c,d:10,12,120 25.2,5 26.越界访问,可能正常输出,可能段错误 27. 0,41 28. a)11 b) 320 29. aab; ba-b; aa-b; 30. p150x801005; p250x810…

TIM(Timer)定时中断 P1

难点:定时器级联、主从模式 一、简介: 1.TIM(Timer)定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 补充: { 定时器本质上是一个计数器,可以工作在定时或计数模式&…

哈希表哈希桶(C++实现)

哈希的概念 顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素 时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即 O( l o g 2 N log_2 N log2​N)&…

HTML-多媒体嵌入-MDN文档学习笔记

HTML-多媒体与嵌入 查看更多学习笔记&#xff1a;GitHub&#xff1a;LoveEmiliaForever MDN中文官网 HTML-中的图片 将图片放入网页 可以使用<img/>来将图片嵌入网页&#xff0c;它是一个空元素&#xff0c;最少只需src属性即可工作 <img src"图片链接"…

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

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

【论文精读】BERT

摘要 以往的预训练语言表示应用于下游任务时的策略有基于特征和微调两种。其中基于特征的方法如ELMo使用基于上下文的预训练词嵌入拼接特定于任务的架构&#xff1b;基于微调的方法如GPT使用未标记的文本进行预训练&#xff0c;并针对有监督的下游任务进行微调。 但上述两种策略…

机器学习——聚类问题

&#x1f4d5;参考&#xff1a;西瓜书ysu老师课件博客&#xff08;3&#xff09;聚类算法之DBSCAN算法 - 知乎 (zhihu.com) 目录 1.聚类任务 2.聚类算法的实现 2.1 划分式聚类方法 2.1.1 k均值算法 k均值算法基本原理&#xff1a; k均值算法算法流程&#xff1a; 2.2 基于…

代码随想录算法训练营第31天|● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

文章目录 理论基础分发饼干思路&#xff1a;代码&#xff1a; 摆动序列思路一 贪心算法&#xff1a;代码&#xff1a; 思路二&#xff1a;动态规划&#xff08;想不清楚&#xff09;代码&#xff1a; 最大子序和思路&#xff1a;代码&#xff1a; 理论基础 贪心算法其实就是没…

Android Jetpack Compose 沉浸式状态栏的实现

目录 概述效果展示代码实现总结 概述 说到沉浸式状态栏&#xff0c;很多小伙伴可能不太熟悉&#xff0c;其实让Android的状态栏的颜色和APP的主题颜色相同&#xff0c;给人感觉状态栏和APP就是一体的。沉浸式的状态栏让页面看起来更舒服&#xff0c;实现沉浸式状态栏也很简单&…

精品jsp+ssm基于Java的疫苗接种管理系统

《[含文档PPT源码等]精品jspssm基于Java的疫苗接种管理系统[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 使用技术&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版…

2024年!PyCharm快捷键大全

收藏&#xff01;PyCharm快捷键大全 工欲善其事必先利其器&#xff0c;PyCharm 是最popular的Python开发工具&#xff0c;它提供的功能非常强大&#xff0c;是构建大型项目的理想工具之一&#xff0c;如果能挖掘出里面实用技巧&#xff0c;能带来事半功倍的效果。 本文主要向大…

PLC_博图系列☞FBD

PLC_博图系列☞FBD 文章目录 PLC_博图系列☞FBD背景介绍FBD优势局限性 FBD 元素 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 FBD 背景介绍 这是一篇关于PLC编程的文章&#xff0c;特别是关于西门子的博图软件。我并不是专业的PLC编程人员&#xff0c;也不懂电路…

Linux程序地址空间

引言 以下为示意草图 下面以代码验证一下&#xff1a; 1 #include<stdio.h> 2 #include<stdlib.h>3 …

C++数据结构与算法——双指针法

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

Flutter 动画(显式动画、隐式动画、Hero动画、页面转场动画、交错动画)

前言 当前案例 Flutter SDK版本&#xff1a;3.13.2 显式动画 Tween({this.begin,this.end}) 两个构造参数&#xff0c;分别是 开始值 和 结束值&#xff0c;根据这两个值&#xff0c;提供了控制动画的方法&#xff0c;以下是常用的&#xff1b; controller.forward() : 向前…

【开源】在线办公系统 JAVA+Vue.js+SpringBoot+MySQL

目录 1 功能模块1.1 员工管理模块1.2 邮件管理模块1.3 人事档案模块1.4 公告管理模块 2 系统展示3 核心代码3.1 查询用户3.2 导入用户3.3 新增公告 4 免责声明 本文项目编号&#xff1a; T 001 。 \color{red}{本文项目编号&#xff1a;T001。} 本文项目编号&#xff1a;T001。…

前端vue3实现本地及在线文件预览(含pdf/txt/mp3/mp4/docx/xlsx/pptx)

一、仅需实现在线预览&#xff0c;且文件地址公网可访问 &#xff08;一&#xff09;微软office免费预览&#xff08;推荐&#xff09; 支持doc/docx/xls/xlsx/ppt/pptx等多种office文件格式的免费预览 //示例代码//​在https://view.officeapps.live.com/op/view.aspx?src…