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))

必看视频!获取2024年最新Java开发全套学习资料 备注Java

;

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

void setConnectionCallback(const ConnectionCallback& cb)

{

connectionCallback_ = cb;

}

一个简单的赋值。

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

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

typedef std::shared_ptr TcpConnectionPtr;

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

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

就是说,不写也可以,muduo库内部有默认的连接回调,不过效果可能没那么理想化,想定制就自己写一个连接回调。

那个_1是预留参数位,调用者为muduo网络库。

知其然不知其所以然,大厂常问面试技术如何复习?

1、热门面试题及答案大全

面试前做足功夫,让你面试成功率提升一截,这里一份热门350道一线互联网常问面试题及答案助你拿offer

2、多线程、高并发、缓存入门到实战项目pdf书籍

3、文中提到面试题答案整理

4、Java核心知识面试宝典

覆盖了JVM 、JAVA集合、JAVA多线程并发、JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入


4、Java核心知识面试宝典*

覆盖了JVM 、JAVA集合、JAVA多线程并发、JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入

[外链图片转存中…(img-XLNkvk4l-1716405401480)]

[外链图片转存中…(img-VaFDg2gD-1716405401481)]

[外链图片转存中…(img-7Npxkx6d-1716405401481)]

  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值