qidao123.com技术社区-IT企服评测·应用市场

标题: 【从零实现JsonRpc框架#2】Muduo库介绍 [打印本页]

作者: 水军大提督    时间: 前天 17:20
标题: 【从零实现JsonRpc框架#2】Muduo库介绍
1.基本概念

Muduo 由陈硕大佬开辟,是一个基于非壅闭IO事件驱动的C++高并发TCP网络编程库。它是一款基于主从Reactor模型的网络库,其利用的线程模型是 one loop per thread
1.1 主从 Reactor 模型


1.2 One Loop Per Thread



2.常见接口

2.1TcpServer 类基础介绍

  1. typedef std::shared_ptr<TcpConnection> TcpConnectionPtr;
  2. typedef std::function<void (const TcpConnectionPtr&)> ConnectionCallback;
  3. typedef std::function<void (const TcpConnectionPtr&, Buffer*, Timestamp)> MessageCallback;
  4. class InetAddress : public muduo::copyable
  5. {
  6. public:
  7.         InetAddress(StringArg ip, uint16_t port, bool ipv6 = false);
  8. };
  9. class TcpServer : noncopyable
  10. {
  11. public:
  12.     enum Option
  13.     {
  14.         kNoReusePort,
  15.         kReusePort,
  16.     };
  17.     TcpServer(EventLoop* loop, const InetAddress& listenAddr, const string& nameArg, Option option = kNoReusePort);
  18.     void setThreadNum(int numThreads);
  19.     void start();
  20.    
  21.     // 当⼀个新连接建⽴成功的时候被调用
  22.     void setConnectionCallback(const ConnectionCallback& cb)
  23.     { connectionCallback_ = cb; }
  24.    
  25.     // 消息的业务处理回调函数---这是收到新连接消息的时候被调用的函数
  26.     void setMessageCallback(const MessageCallback& cb)
  27.     { messageCallback_ = cb; }
  28. };
复制代码


  1. void setConnectionCallback(ConnectionCallback cb); // 连接建立/关闭回调
  2. void setMessageCallback(MessageCallback cb);       // 消息到达回调
复制代码
示例代码:
  1. #include <muduo/net/TcpServer.h>
  2. #include <muduo/net/EventLoop.h>
  3. #include <muduo/net/InetAddress.h>
  4. #include <iostream>
  5. void onConnection(const muduo::net::TcpConnectionPtr& conn) {
  6.     if (conn->connected()) {
  7.         std::cout << "New connection: " << conn->name() << std::endl;
  8.     } else {
  9.         std::cout << "Connection closed: " << conn->name() << std::endl;
  10.     }
  11. }
  12. void onMessage(const muduo::net::TcpConnectionPtr& conn, muduo::net::Buffer* buf, muduo::Timestamp receiveTime) {
  13.     std::string msg(buf->retrieveAllAsString());
  14.     std::cout << "Received message: " << msg << std::endl;
  15.     conn->send(msg);  // 回显消息
  16. }
  17. int main() {
  18.     muduo::net::EventLoop loop;
  19.     muduo::net::InetAddress listenAddr(8080);
  20.     muduo::net::TcpServer server(&loop, listenAddr, "EchoServer");
  21.     server.setConnectionCallback(onConnection);
  22.     server.setMessageCallback(onMessage);
  23.     server.setThreadNum(4);  // 使用 4 个工作线程
  24.     server.start();
  25.     loop.loop();
  26.     return 0;
  27. }
复制代码
2.2EventLoop 类基础介绍

EventLoop 是 Muduo 库的核心类之一,负责事件循环(event loop)。每个线程只能有一个 EventLoop 实例,它负责监听和分发事件(如 I/O 事件、定时器事件等)。
常用接口:

成员:
  1. std::unique_ptr<Poller> poller_;   // 底层 IO 多路复用(epoll/poll)
  2. std::vector<Functor> pendingFunctors_; // 跨线程任务队列
复制代码
核心方法
  1. void loop();          // 启动事件循环(必须在本线程调用)
  2. void quit();                 // 停止循环
  3. void runInLoop(Functor cb); // 跨线程安全的任务提交
  4. TimerId runAfter(double delay, TimerCallback cb); // 定时器
复制代码
代码示例:
  1. #include <muduo/net/EventLoop.h>
  2. #include <iostream>
  3. void print() {
  4.     std::cout << "Hello, EventLoop!" << std::endl;
  5. }
  6. int main() {
  7.     muduo::net::EventLoop loop;
  8.     loop.runAfter(1.0, print);  // 1秒后执行 print 函数
  9.     loop.loop();  // 启动事件循环
  10.     return 0;
  11. }
复制代码
2.3TcpConnection 基础介绍

TcpConnection 表示一个 TCP 连接。它是 TcpServer 的内部类,用于管理客户端与服务器之间的连接。每个连接都有一个唯一的 TcpConnection 对象。

特性:

  1. void send(const void* data, size_t len);  // 线程安全的发送接口
  2. void shutdown();                          // 半关闭连接(写端)
  3. bool connected();                                                  // 判断当前连接是否正常
复制代码
示例代码:
  1. void onMessage(const muduo::net::TcpConnectionPtr& conn, muduo::net::Buffer* buf, muduo::Timestamp receiveTime) {
  2.     std::string msg(buf->retrieveAllAsString());
  3.     std::cout << "Received message: " << msg << std::endl;
  4.     if (msg == "quit\n") {
  5.         conn->shutdown();  // 如果收到 "quit",关闭连接
  6.     } else {
  7.         conn->send(msg);  // 回显消息
  8.     }
  9. }
复制代码
2.4TcpClient 类基础介绍

TcpClient 用于创建 TCP 客户端。它可以连接到长途服务器并与之通信。
常用接口

同步控制:

  1. CountDownLatch latch(1);
  2. client.setConnectionCallback([&](const TcpConnectionPtr& conn) {
  3.     if (conn->connected()) latch.countDown();
  4. });
  5. client.connect();
  6. latch.wait();  // 等待连接成功
复制代码
示例代码:
  1. #include <muduo/net/TcpClient.h>
  2. #include <muduo/net/EventLoop.h>
  3. #include <muduo/net/InetAddress.h>
  4. #include <iostream>
  5. void onConnection(const muduo::net::TcpConnectionPtr& conn) {
  6.     if (conn->connected()) {
  7.         std::cout << "Connected to server." << std::endl;
  8.         conn->send("Hello, server!\n");
  9.     } else {
  10.         std::cout << "Disconnected from server." << std::endl;
  11.     }
  12. }
  13. void onMessage(const muduo::net::TcpConnectionPtr& conn, muduo::net::Buffer* buf, muduo::Timestamp receiveTime) {
  14.     std::string msg(buf->retrieveAllAsString());
  15.     std::cout << "Received from server: " << msg << std::endl;
  16. }
  17. int main() {
  18.     muduo::net::EventLoop loop;
  19.     muduo::net::InetAddress serverAddr("127.0.0.1", 8080);
  20.     muduo::net::TcpClient client(&loop, serverAddr, "EchoClient");
  21.     client.setConnectionCallback(onConnection);
  22.     client.setMessageCallback(onMessage);
  23.     client.connect();
  24.     loop.loop();
  25.     return 0;
  26. }
复制代码
2.5.Buffer 类基础介绍

Buffer 是 Muduo 中用于处理网络数据缓冲区的类。它实现了动态缓冲区的功能,支持高效的读写操纵。
常用接口

示例代码:
  1. void onMessage(const muduo::net::TcpConnectionPtr& conn, muduo::net::Buffer* buf, muduo::Timestamp receiveTime) {
  2.     while (buf->readableBytes() >= sizeof(int)) {
  3.         const char* data = buf->peek();
  4.         int be32 = *reinterpret_cast<const int*>(data);
  5.         int host32 = muduo::net::sockets::networkToHost32(be32);  // 转换为本地字节序
  6.         buf->retrieve(sizeof(int));
  7.         std::cout << "Received integer: " << host32 << std::endl;
  8.     }
  9. }
复制代码
3.总结


这些类是 Muduo 库的核心组件,通过它们可以轻松构建高性能的 TCP 网络应用

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4