当前位置: 首页 > news >正文

《Muduo网络库:基于Muduo的网络服务器编程示例》

Muduo网络库,是一个基于Reactor模式的高性能多线程C++网络库。

Muduo网络库给用户提供了两个主要的类:

  • TcpServer类:用于编写服务器程序的。
  • TcpClient类:用于编写客户端的。

Muduo 的核心优势在于 “封装复杂底层,聚焦业务逻辑”,能够把网络I/O的代码和业务代码区分开。无需手动处理epoll、socket、线程安全等细节,只需关注 “连接建立时做什么、收到消息时做什么”,大幅提升了开发效率。

网络I/O的代码由网络库封装,用户不需要关心,只需要关心业务逻辑的处理(用户的连接和断开、用户的读写事件)即可。

Muduo网络库编写服务器示例:

#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
#include <iostream>
#include <functional>
#include <string>using namespace std;
using namespace muduo;
using namespace muduo::net;
using namespace placeholders;/*基于muduo网络库开发服务器程序
1.组合TcpServer对象
2.创建EventLoop事件循环对象的指针
3.明确TcpServer构造函数需要什么参数,输出ChatServer的构造函数
4.在当前服务器类的构造函数中,注册处理连接的回调函数和处理读写事件的回调函数
5.设置合适的服务器端线程数量,muduo库会自己分配I/O线程和worker线程
*/class ChatServer
{
public:ChatServer(EventLoop *loop,               // 事件循环const InetAddress &listenAddr, // ip + portconst string &nameArg)         // 服务器名字: _server(loop, listenAddr, nameArg), _loop(loop){// 给服务器注册用户连接的创建和断开回调。客户端建立/断开连接时,自动触发onConnection_server.setConnectionCallback(std::bind(&ChatServer::onConnection, this, _1));// 给服务器注册用户读写事件的回调。 客户端发送数据到达时,自动触发onMessage_server.setMessageCallback(std::bind(&ChatServer::onMessage, this, _1, _2, _3));// 设置服务器端线程的数量 1个I/O线程 3个worker线程_server.setThreadNum(4);}// 开启事件循环void start(){_server.start();}private:// 专门处理用户连接创建和断开void onConnection(const TcpConnectionPtr &conn){if (conn->connected()){cout << conn->peerAddress().toIpPort() << " -> " << conn->localAddress().toIpPort() << " state: online " << endl;}else{cout << conn->peerAddress().toIpPort() << " -> " << conn->localAddress().toIpPort() << " state: offline " << endl;conn->shutdown(); // 释放socket资源,等价于close(fd),Muduo会自动从epoll中移除该fd// _loop->quit();  // 退出epoll}}// 专门处理用户的读写事件void onMessage(const TcpConnectionPtr &conn, // 数据连接(哪个客户端连接)Buffer *buffer,               // Muduo封装的缓冲区(解决Tcp粘包/拆包)Timestamp time)               // 接收数据的时间信息{string buf = buffer->retrieveAllAsString();                          // 从缓冲区读取所有数据,retrieveAllAsString() 会清空缓冲区,避免重复读取cout << "recv data: " << buf << "time: " << time.toString() << endl; // 打印接收信息conn->send(buf);}TcpServer _server; // #1EventLoop *_loop;  // #2 类似epoll 可以注册关心的socket 有事件发生也会通知
};int main()
{// 1. 创建EventLoop对象 (Muduo的Reactor核心,等价于epoll)EventLoop loop; // 主线程的事件循环,负责监听IO事件// 2. 创建服务端地址对象 (ip和port,这里示例绑定127.0.0.1仅本地可访问)InetAddress addr("127.0.0.1", 8080);// 3. 创建ChatServer实例ChatServer server(&loop, addr, "ChatServer");// 4. 启动服务器 (内部完成listen+将监听socket注册到epoll)server.start(); // listenfd epoll_ctl->epoll// 5. 启动事件循环 (阻塞等待epoll事件,相当于epoll_wait)loop.loop(); // 主线程进入无限循环,持续处理IO事件,直到主动退出return 0;
}

很简单就建立了一个muduo网络库的高性能服务器,覆盖了 “连接管理” 和 “消息接收” 的核心流程。        

编译运行:

g++ -o muduo_server -std=c++11 muduo_server.cpp -lmuduo_net -lmuduo_base -lpthread

本地测试:

这里只编写了简单的服务器。用于简单了解Muduo网络库的使用。

http://www.dtcms.com/a/395575.html

相关文章:

  • 详解JNI JNA!
  • C# 获取docx文档页数的古怪方法
  • 算法题(215):奶牛飞盘
  • Ubuntu 安装与使用C++ onnxruntime库
  • Ubuntu 部署 Zabbix 6.0 LTS 监控平台
  • 基于springboot家政、上门服务、Java源码系统功能结构
  • 从 “纸笔清单” 到全栈引擎:数据填报与类 Excel 控件如何重塑企业效率曲线
  • FPGA学习笔记——图像处理之饱和度调节(RGB)
  • MySQL 读写分离详解与 MyCat 实战部署
  • SEU-project1项目调试过程记录
  • STM32H743-结合CubeMX新建HAL库MDK工程
  • [国奖版本!更新完毕]2025华为杯E题数学建模研赛E题研究生数学建模思路代码文章成品:高速列车轴承智能故障诊断问题
  • 【一天一个Web3概念】区块链中的双花问题:概念、案例与防范措施
  • Java 大视界 -- Java 大数据机器学习模型在金融衍生品定价与风险管理中的应用(415)
  • STC15W4K56S4 单片机 PWM 功能详解与配置指南
  • 秋招冲刺!AI面试如何破解企业招聘难题?
  • MySQL脚本转换为StarRocks完整指南
  • Mysql常见sql语句优化
  • CPU性能优化指南:让处理器火力全开
  • 火山PromptPilot ,支持api sdk构建AI应用开发
  • 使用Rax构建小程序项目踩坑记录
  • Vue自定义滚动条的实现
  • 【鸿蒙面试题-7】鸿蒙与web混合开发
  • 基于Java语言的搭子小程序_搭子APP平台
  • implements Serializable作用和原理
  • valkey9.0之HFE
  • 基于C#的湿度上位机实现方案
  • 汽车电子模块缩写
  • 随机裁剪 vs. 中心裁剪:深度学习中图像预处理的核心技术解析
  • 四大金刚之计算机网络