基于muduo的集群服务器开发之网路模块

基于muduo的集群服务器开发之网路模块,第1张

1.网路模块的功能

完成网路数据发送与接收,解析接收的数据,然后进行回调业务的代码,实现网路模块与业务的解耦。正常的解耦,在c++有两种,通过基于对象的回调方式,或者利用接口编程。

网络模块与业务模块的解耦,采用的是回调机制,具体看我另一篇博客

基于muduo的集群class="superseo">class="superseo">服务器开发之网路模块与业务解耦_@seven@的博客-CSDN博客

2.muduo网路模块实现

muduo实现网路模块很简单,基本是模板,我们只需要修改回调函数里面的功能即可。

可以参考一下,我这篇文章

muduo网络库使用模板_@seven@的博客-CSDN博客

3.模板

头文件

#ifndef CHATSERVER_H
#define CHATSERVER_H

#include 
#include 
using namespace muduo;
using namespace muduo::net;

// 聊天服务器的主类
class ChatServer
{
public:
    // 初始化聊天服务器对象
    ChatServer(EventLoop *loop,
               const InetAddress &listenAddr,
               const string &nameArg);

    // 启动服务
    void start();

private:
    // 上报链接相关信息的回调函数
    void onConnection(const TcpConnectionPtr &);

    // 上报读写事件相关信息的回调函数
    void onMessage(const TcpConnectionPtr &,
                   Buffer *,
                   Timestamp);

    TcpServer _server; // 组合的muduo库,实现服务器功能的类对象
    EventLoop *_loop;  // 指向事件循环对象的指针
};

#endif

源文件

#include "chatserver.hpp"
#include "json.hpp"
#include "chatservice.hpp"

#include 
#include 
#include 
using namespace std;
using namespace placeholders;
using json = nlohmann::json;

// 初始化聊天服务器对象
ChatServer::ChatServer(EventLoop *loop,
                       const InetAddress &listenAddr,
                       const string &nameArg)
    : _server(loop, listenAddr, nameArg), _loop(loop)
{
//_1这些是参数占位符
    // 注册链接回调
    _server.setConnectionCallback(std::bind(&ChatServer::onConnection, this, _1));

    // 注册消息回调
    _server.setMessageCallback(std::bind(&ChatServer::onMessage, this, _1, _2, _3));

    // 设置线程数量
    _server.setThreadNum(4);
}

// 启动服务
void ChatServer::start()
{
    _server.start();
}

// 上报链接相关信息的回调函数
void ChatServer::onConnection(const TcpConnectionPtr &conn)
{
    // 客户端断开链接
    if (!conn->connected())
    {
        ChatService::instance()->clientCloseException(conn);
        conn->shutdown();
    }
}

// 上报读写事件相关信息的回调函数
void ChatServer::onMessage(const TcpConnectionPtr &conn,
                           Buffer *buffer,
                           Timestamp time)
{
    string buf = buffer->retrieveAllAsString();

    // 测试,添加json打印代码
    cout << buf << endl;

    // 数据的反序列化
    json js = json::parse(buf);
    // 达到的目的:完全解耦网络模块的代码和业务模块的代码
    //msgid就是事务id
    // 通过js["msgid"] 获取=》业务handler=》conn  js  time
    auto msgHandler = ChatService::instance()->getHandler(js["msgid"].get());
    // 回调消息绑定好的事件处理器,来执行相应的业务处理
    msgHandler(conn, js, time);
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/926371.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存