2.muduo网路模块实现完成网路数据发送与接收,解析接收的数据,然后进行回调业务的代码,实现网路模块与业务的解耦。正常的解耦,在c++有两种,通过基于对象的回调方式,或者利用接口编程。
网络模块与业务模块的解耦,采用的是回调机制,具体看我另一篇博客
基于muduo的集群服务器开发之网路模块与业务解耦_@seven@的博客-CSDN博客
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); }



