
基于muduo的聊天服务器
文章平均质量分 54
基于muduo和nginx实现一个多人聊天服务器
TABE_
这个作者很懒,什么都没留下…
展开
-
单机,集群和分布式
这里写目录标题单机集群分布式单机单机就是所有的业务全部写在一个项目中,部署服务到一台服务器上,所有的请求业务都由这台服务器处理。显然,当业务增长到一定程度的时候,服务器的硬件会无法满足业务需求。自然而然地想到一个程序不行就部署多个喽,这就是集群。集群集群就是单机的多实例,在多个服务器上部署多个服务,每个服务就是一个节点,部署N个节点,处理业务的能力就提升 N倍(大约),这些节点的集合就叫做集群。负载均衡:协调集群里的每个节点均衡地接受业务请求。通俗的讲就是服务A和服务B相同时间段内处理的同类业务原创 2021-10-04 20:30:51 · 860 阅读 · 0 评论 -
聊天服务器的客户端开发
客户端有2个线程,一个是读线程,专门接收chatserver服务器发送过来的消息响应,一个是写线程,接收用户的输入,发送相应的业务数据。基于控制台程序的客户端,没有图形界面,根据我们定义好的命令来请求。客户端主程序如下:#include "group.hpp"#include "json.hpp"#include "public.hpp"#include "user.hpp"#include <arpa/inet.h>#include <atomic>#includ原创 2021-11-04 10:19:34 · 240 阅读 · 0 评论 -
数据表操作层代码Model
数据表操作层代码Model一级目录二级目录三级目录我们将数据库的操作和业务代码分离开,因此业务模块应该包含一个个可以操作数据表的对象,通过这些对象的方法来实现对数据库的增删改查操作。一级目录二级目录三级目录...原创 2021-11-04 10:15:10 · 609 阅读 · 0 评论 -
MySQL数据库模块代码DB
MySQL数据库代码封装db.hppdb.cpp为了减少业务模块ChatService的复杂度,我们将数据库的增删改查操作封装成一个单独的类。db.hpp我们在include下的server下的db下,创建头文件db.hpp:#ifndef DB_H#define DB_H#include <mysql/mysql.h>#include <string>using namespace std;//数据库操作类class MySQL{public:原创 2021-11-04 10:02:02 · 443 阅读 · 0 评论 -
服务器的主函数main
聊天室服务器的主函数:#include "chatserver.hpp"#include "chatservice.hpp"#include <iostream>#include <signal.h>using namespace std;//处理服务器ctrl+c结束后,进行重置user的状态信息void resetHandler(int){ ChatService::instance()->reset(); //调用重置函数 exit(0原创 2021-11-04 10:01:50 · 241 阅读 · 0 评论 -
标记消息类型的public文件
public.hpp 是server和client的公共文件,用于标记消息类型。//该文件是server和client的公共文件,用于标记消息类型#ifndef PUBLIC_H#define PUBLIC_Henum EnMsgType{ //登陆消息 LOGIN_MSG = 1, //登陆响应消息 LOGIN_MSG_ACK, //注销消息 LOGINOUT_MSG, //注册消息 REG_MSG, //注册响应消息原创 2021-11-04 10:01:40 · 397 阅读 · 0 评论 -
网络模块代码ChatServer
ChatServerchatserver.hppchatserver.cpp服务器的网络模块代码借助于muduo网络库,服务器通过muduo网络库来进行通信。chatserver.hpp首先,我们在include下的server下创建头文件chatserver.hpp:#ifndef CHATSERVER_H#define CHATSERVER_H#include <muduo/net/EventLoop.h>#include <muduo/net/TcpServer.h&原创 2021-11-03 21:28:41 · 466 阅读 · 0 评论 -
业务模块代码ChatService
业务模块代码ChatServicechatservice.hppchatservice.cpp本项目没有将业务模块和网络模块写在一起,而是把网络模块收到的消息派发到业务模块,实现了网络模块和业务模块的完全解耦。当有新的业务需要添加时,只需要改变业务模块的代码,网络模块的代码是不受影响的。chatservice.hpp我们在include下的server创建头文件chatservice.hpp:#ifndef CHATSERVICE_H#define CHATSERVICE_H#include原创 2021-11-04 10:01:17 · 420 阅读 · 0 评论 -
MySQL数据表的设计
MySQL数据表服务器端数据表的设计创建表的语句服务器端数据表的设计首先就是要解决数据的问题,作为一个聊天系统,我们的服务器端肯定要有用户的信息,比如说账号,用户名,密码等。在登录的时候,我们可以查询这个表里面的信息对用户身份进行验证,在注册的时候,我们则可以往表里面去写入数据。User表用户登录之后,首先就是进行聊天业务,我们必须要知道该用户的好友都有谁。在加好友时,我们就可以往这张表里面去写入信息并在一对一聊天时查询这里面的信息去看好友是否在线。Friend表然后便是群组业务了,群组中我原创 2021-11-03 21:07:15 · 1945 阅读 · 0 评论 -
使用redis解决用户跨服务器通信
我们在集群聊天服务器中涉及的通信是:一对一的聊天,群聊。如上图所示,client1登录在chatserver1上,client2登录在chatserver2上,client3登录在chatserver3上。按我们现有的单台服务器业务来说,我们在每一台服务器上都有_userConMap,当client1给client2发送聊天消息的话,在chatserver1上的_userConMap肯定是找不到client2的connection。在集群环境中,我们服务器的代码在业务逻辑上应该做修改,客户端完全不用改.原创 2021-11-03 20:52:22 · 755 阅读 · 0 评论 -
nginx 负载均衡/一致性哈希
nginx 负载均衡普通算法哈希算法一致性哈希一致性哈希算法的优点hash环的偏斜虚拟节点普通算法轮询算法:第一个请求给server1,第二个请求给server2,第3个请求给server3,一直轮询下去。权重比算法:比如说,给第1台分配1的权重,给第2台分配2的权重,给第3台分配1的权重,有4个请求到来,其中2个请求分配给第2台,其他两台各分配1个请求。最少连接算法:负载均衡器要记录跟每一台服务器建立的连接,每次发请求的时候,跟哪台请求创建的连接最少就分发给哪台机器,哪台服务器连接少,说明其压力小原创 2021-11-03 16:55:47 · 4263 阅读 · 0 评论 -
nginx 正向代理/反向代理
正向代理/反向代理正向代理反向代理总结正向代理正向代理类似一个跳板机,代理访问外部资源。比如我们国内访问谷歌,直接访问访问不到,我们可以通过一个正向代理服务器,请求发到代理服,代理服务器能够访问谷歌,这样由代理去谷歌取到返回数据,再返回给我们,这样我们就能访问谷歌了。正向代理的用途:访问原来无法访问的资源,如google。可以做缓存,加速访问资源。对客户端访问授权,上网进行认证。代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息。反向代理反向代理(Reverse Proxy原创 2021-11-03 15:38:21 · 193 阅读 · 0 评论 -
使用nginx负载均衡器提高并发量
我们使用的socketfd本质上是文件描述符,默认大小是1024个,我们通过一个进程,使用limit调大,一台服务器在我们的32位的linux下并发量:2万左右的并发量,如果要支持3万,4万用户同时在线聊天就不可以了。如果我们要提高聊天服务器的并发能力,让更多的用户可以同时在线聊天,我们要进行集群部署。在水平方向上扩展多台主机,每一台主机运行着独立的chatserver,我们在下图中,引入了3台主机,每一台主机运行着独立的chatserver服务器,可以给用户提供聊天服务,但是,我们在用QQ客户端登录的时原创 2021-11-03 20:29:19 · 1452 阅读 · 0 评论 -
json的简单使用
json的简单使用普通数据序列化数组序列化容器序列化数据反序列化普通数据序列化#include "json.hpp"using json = nlohmann::json;#include <iostream>#include <vector>#include <map>#include <string>using namespace std;//json序列化示例1void func1(){ json js;//定义一个js原创 2021-11-03 20:12:39 · 734 阅读 · 0 评论 -
基于muduo和nginx的聊天服务器项目总览
项目总览项目需求项目用到的技术jsonmuduo网络库nginxredisMySQL项目需求客户端新用户注册客户端用户登录添加好友和添加群组好友聊天群组聊天离线消息nginx配置tcp负载均衡集群聊天系统支持客户端跨服务器通信项目用到的技术jsonJson是一种轻量级的数据交换格式(也叫数据序列化方式)。Json采用完全独立于编程语言的文本格式来存储和表示数据。也就是说,客户端如果是C++写的,服务器是Java写的,没关系,大家都认识Json,你想把数据发给我,你就把数据序列化成原创 2021-11-03 19:52:57 · 609 阅读 · 4 评论