《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网络库的使用。