2.muduo网路模块实现完成网路数据发送与接收,解析接收的数据,然后进行回调业务的代码,实现网路模块与业务的解耦。正常的解耦,在c++有两种,通过基于对象的回调方式,或者利用接口编程。
网络模块与业务模块的解耦,采用的是回调机制,具体看我另一篇博客
基于muduo的集群class="superseo">class="superseo">服务器开发之网路模块与业务解耦_@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);
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)