文章目录

    • 前言
  • 项目简单架构图

    • 1.0版本:单服务器
  • 2.0版本,横向扩充,负载均衡

  • 3.0版本,调优

  • 代码

  • 讲解

    • setConnectionCallback
  • setMessageCallback

前言


准备翻新一下我那个C++集群聊天室项目的讲解博客,那个系列刚开始讲的还比较有点耐心,后面就直接堆代码了,大家互相理解理解,那确实有点触碰到我目前的极限了,能写下来就不错了。

勉强把项目整好之后我就去看muduo了(好像还有最后一篇《TCPServer》还没放出来哈,真的是因为VScode坏了,然后又有一件不得不做的事情拖住了几天时间。)目前已经粗略的捋了一遍muduo的源码,这周就把项目和源码两个系列好好的整理出来,再背背八股文,把以前的基础找回来,准备面试了。

然后,祝我大莆田无恙吧,这次的事情是突然了点。(就不放张伟了,换妈祖像。)

github地址:chat


项目简单架构图


1.0版本:单服务器

请添加图片描述

2.0版本,横向扩充,负载均衡

请添加图片描述

3.0版本,调优

时间原因还没写。

我又想了一下,这个架构有问题,先留着吧,有兴趣的朋友可以看看哪里有问题。

请添加图片描述


代码


#pragma

#include<muduo/net/TcpServer.h>

#include<muduo/net/EventLoop.h>

#include

using namespace std;

using namespace muduo;

using namespace muduo::net;

class ChatServer{

private:

TcpServer _server;

EventLoop* _loop;

public:

ChatServer(EventLoop* loop,

const InetAddress& listenAddr,

const string& nameArg);

void start();

private:

void onConnection(const TcpConnectionPtr& conn);

void onMessage(const TcpConnectionPtr& conn,Buffer* buff,Timestamp time);

};

#include “chatserver.hpp”

#include “chatservice.hpp”

#include “json.hpp”

#include

#include

using json = nlohmann::json;

using namespace std;

using namespace placeholders;

ChatServer::ChatServer(EventLoop *loop,

const InetAddress &listenAddr,

const string &nameArg) : _server(loop, listenAddr, nameArg),

_loop(loop)

{

//注册连接回调

_server.setConnectionCallback(std::bind(&ChatServer::onConnection, this, _1));

//注册消息回调

_server.setMessageCallback(std::bind(&ChatServer::onMessage, this, _1, _2, _3));

//设置线程数

_server.setThreadNum(5);

}

void ChatServer::start()

{

_server.start();

}

void ChatServer::onMessage(const TcpConnectionPtr &conn, Buffer *buff, Timestamp time){

string buf = buff->retrieveAllAsString();

json js = json::parse(buf);

//通过msgid获取业务回调,进行网络模块和任务模块之间的解耦合

auto msgHandler = ChatService::instance()->getHandle(js[“msgid”].get());

//回调消息绑定好的事件处理器,执行相应的业务处理

msgHandler(conn,js,time);

//成功解耦

}

void ChatServer::onConnection(const TcpConnectionPtr &conn){

if(!conn->connected()){ //用户断开连接

ChatService::instance()->clientCloseException(conn);

conn->shutdown();

}

}


讲解


无奈,有段时间没有画类图了,不然这里放张类图可能会好看点。讲业务层的时候是需要放类图了,那个牵扯有点多了。

setConnectionCallback

_server.setConnectionCallback(std::bind(&ChatServer::onConnection, this, _1));

这个_server是一个TcpServer对象,我们就直接去看源码吧。

void setConnectionCallback(const ConnectionCallback& cb)

{

connectionCallback_ = cb;

}

一个简单的赋值。

typedef std::function<void (const TcpConnectionPtr&)> ConnectionCallback;

ConnectionCallback 是一个函数对象,需要传入一个TcpConnection对象的指针。

typedef std::shared_ptr TcpConnectionPtr;

再多久不用说啦,说下去没完没了的了。

这行代码的意思是:用户注册一个连接回调,当收到连接状态变更消息时,一并调用此回调。

Logo

「智能机器人开发者大赛」官方平台,致力于为开发者和参赛选手提供赛事技术指导、行业标准解读及团队实战案例解析;聚焦智能机器人开发全栈技术闭环,助力开发者攻克技术瓶颈,促进软硬件集成、场景应用及商业化落地的深度研讨。 加入智能机器人开发者社区iRobot Developer,与全球极客并肩突破技术边界,定义机器人开发的未来范式!

更多推荐