Muduo 是一个基于 C++ 的高性能、非阻塞 I/O 的网络库,主要用于处理高并发的网络通信。它封装了 Linux 上的 epoll 和 pthread,实现了事件驱动的网络编程模型。Muduo 的设计理念是将网络 I/O 与业务逻辑解耦,通过 Reactor 模型来管理 I/O 事件。
在 Muduo 中,主要有以下几类接口和类:
EventLoop
是 Muduo 的核心类之一,它代表了一个事件循环。每个线程都有一个 EventLoop
,并且每个 EventLoop
负责处理自己的 I/O 事件和定时器。
loop()
:启动事件循环,进入 I/O 多路复用模型(如 epoll),开始等待事件。quit()
:退出事件循环。runAfter()
:在指定的时间后执行一个任务。runEvery()
:每隔一段时间执行一个任务。EventLoop loop;
loop.loop(); // 启动事件循环
TcpServer
是 Muduo 用于 TCP 服务端的核心类。它用于管理客户端的连接,并处理来自客户端的请求。它基于 Reactor 模型,能够高效地处理并发连接。
setConnectionCallback()
:设置连接回调,当客户端连接建立或断开时触发。setMessageCallback()
:设置消息回调,当客户端发送数据时触发。start()
:启动服务,开始监听客户端连接。TcpServer server(loop, listenAddr, "ServerName");
server.setConnectionCallback(onConnection);
server.setMessageCallback(onMessage);
server.start();
TcpClient
是 Muduo 用于 TCP 客户端的核心类。它封装了与服务器的连接、断开和消息收发等操作。
connect()
:连接到服务器。setConnectionCallback()
:设置连接回调,当连接建立或关闭时触发。setMessageCallback()
:设置消息回调,当收到来自服务器的数据时触发。TcpClient client(loop, serverAddr, "ClientName");
client.setConnectionCallback(onConnection);
client.setMessageCallback(onMessage);
client.connect();
TcpConnection
类代表一个客户端连接。它提供了对客户端连接的操作方法,如发送消息、关闭连接等。TcpConnection
主要通过 TcpServer
或 TcpClient
来使用。
send()
:向客户端发送数据。close()
:关闭连接。connected()
:检查连接是否有效。peerAddress()
:获取远程地址(客户端地址)。void onConnection(const TcpConnectionPtr& conn)
{
if (conn->connected())
{
LOG_INFO << "Connection established: " << conn->peerAddress().toIpPort();
}
else
{
LOG_INFO << "Connection closed: " << conn->peerAddress().toIpPort();
}
}
Buffer
是 Muduo 提供的一个数据缓冲区类,用于在网络通信中存储数据。它在处理数据接收和发送时发挥着重要作用。
retrieveAllAsString()
:获取并清空缓冲区内容。retrieve(size_t len)
:检索指定长度的数据,并移动缓冲区的读指针。append()
:向缓冲区添加数据。readableBytes()
:获取当前缓冲区中可读的字节数。Buffer buffer;
buffer.append(data, length);
std::string msg = buffer.retrieveAllAsString();
InetAddress
类代表一个网络地址,它封装了 IP 地址和端口号。这个类用于在服务器端指定监听地址,或者在客户端连接服务器时使用。
toIpPort()
:将地址转换为 IP:端口形式的字符串。toIp()
:获取 IP 地址。toPort()
:获取端口号。InetAddress listenAddr(8080);
InetAddress serverAddr("127.0.0.1", 8080);
Muduo 提供了一个简单的日志库,用于输出调试信息和错误信息。Logging
是一个全局可用的日志工具,支持不同的日志级别,如 INFO
、ERROR
、DEBUG
等。
LOG_INFO
:用于输出信息日志。LOG_ERROR
:用于输出错误日志。LOG_DEBUG
:用于输出调试日志。LOG_INFO << "Server started";
LOG_ERROR << "Failed to connect to server";
Timestamp
类用于表示时间戳,主要用于记录事件发生的时间。它常与 EventLoop
和 TcpConnection
等类配合使用。
now()
:获取当前时间戳。toString()
:将时间戳转换为字符串表示形式。Timestamp now = Timestamp::now();
LOG_INFO << "Current time: " << now.toString();
TimerQueue
用于管理定时器任务,而 TimerId
是定时器的标识符。EventLoop
可以通过定时器来执行延时任务或周期性任务。
runAfter()
:在指定的时间后执行任务。runEvery()
:每隔指定时间执行一次任务。loop.runAfter(2.0, []() { LOG_INFO << "2 seconds passed"; });
loop.runEvery(3.0, []() { LOG_INFO << "3 seconds passed"; });
ThreadPool
是一个线程池类,用于管理多个工作线程并分配任务。Muduo 中的 ThreadPool
用于执行需要并行的操作,比如数据处理、计算等。
start()
:启动线程池。run()
:向线程池提交任务。Muduo 提供了丰富的接口来处理高并发的网络 I/O。以下是一些常见的接口:
EventLoop
:事件循环,处理 I/O 事件。TcpServer
:TCP 服务器,管理连接并处理消息。TcpClient
:TCP 客户端,与服务器建立连接并发送数据。TcpConnection
:代表一个客户端连接,提供发送、接收数据的功能。Buffer
:用于数据缓冲区的操作。InetAddress
:封装 IP 地址和端口号。Logging
:日志输出工具。TimerQueue
和 TimerId
:定时器功能,用于执行延时或周期性任务。这些接口和类帮助开发者在高并发网络环境下高效地处理各种网络事件,并实现复杂的业务逻辑。通过合理地使用这些接口,你可以快速构建高性能的网络应用。