在 C++ 仿 Muduo 库的实现中,Server 服务器模块是非常关键的一部分。它负责处理客户端的连接、管理 I/O 多路复用、以及处理来自客户端的请求。Muduo 是一个高性能的网络库,常用于实现服务器程序,特别是 HTTP 和 TCP 协议的服务器。

在这里,我们可以简单实现一个基础的 Server 类。Muduo 库的核心思想是事件驱动,它通过事件循环来管理各种事件的处理。实现 Server 服务器模块的基本步骤大致如下:

1. 定义一个简单的 Server 类

我们首先定义一个 Server 类,这个类将使用 TcpServer 类来管理 TCP 连接。

#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
#include <muduo/base/Logging.h>

using namespace muduo;
using namespace muduo::net;

class EchoServer
{
public:
    EchoServer(EventLoop* loop, const InetAddress& listenAddr)
        : server_(loop, listenAddr, "EchoServer")  // 创建一个 TcpServer 对象
    {
        // 设置新连接的回调函数
        server_.setConnectionCallback(
            std::bind(&EchoServer::onConnection, this, std::placeholders::_1));
        
        // 设置接收到消息时的回调函数
        server_.setMessageCallback(
            std::bind(&EchoServer::onMessage, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
    }

    void start()
    {
        server_.start();  // 启动服务器
    }

private:
    void onConnection(const TcpConnectionPtr& conn)
    {
        if (conn->connected())
        {
            LOG_INFO << "New connection from " << conn->peerAddress().toIpPort();
        }
        else
        {
            LOG_INFO << "Connection closed";
        }
    }

    void onMessage(const TcpConnectionPtr& conn, Buffer* buffer, Timestamp time)
    {
        // 读取客户端发送过来的数据
        std::string msg = buffer->retrieveAsString(buffer->readableBytes());
        LOG_INFO << "Received message: " << msg;

        // 回显消息到客户端
        conn->send(msg);
    }

    TcpServer server_;
};

int main()
{
    // 创建 EventLoop 对象
    EventLoop loop;

    // 服务器监听地址
    InetAddress listenAddr(12345);  // 监听端口 12345

    // 创建并启动 EchoServer
    EchoServer server(&loop, listenAddr);
    server.start();

    // 启动事件循环
    loop.loop();

    return 0;
}

2. 代码解析

  • TcpServer:
    • TcpServer 是 Muduo 中的一个核心类,用于处理 TCP 网络通信。它管理了服务器的事件循环、监听端口、接受连接等。
    • setConnectionCallback 设置一个回调函数,当新的连接到来或者连接关闭时,调用相应的回调函数。
    • setMessageCallback 设置另一个回调函数,用来处理从客户端接收到的消息。
  • EventLoop:
    • EventLoop 是 Muduo 的核心类之一,管理事件的循环处理。在 Muduo 中,EventLoop 会在 loop()方法中阻塞,等待并处理各种 I/O 事件,比如新连接、数据到达等。
  • Connection 回调:
    • 在 onConnection 回调中,我们检查了连接的状态:如果是新连接,就输出日志;如果是连接关闭,也会输出日志。
  • Message 回调:
    • 在 onMessage 回调中,我们从接收到的 Buffer 中获取客户端发来的消息,并将其回显给客户端。

3. 服务器启动

在 main 函数中:

  • 创建了一个 EventLoop 对象,负责事件的调度。
  • 使用 TcpServer 来监听端口 12345,并且将 EchoServer 的 onConnection 和 onMessage 回调绑定到 TcpServer 上。
  • 调用 server.start() 启动服务器,并进入事件循环。

4. 编译和运行

你可以用以下命令编译这个示例程序:

g++ -std=c++11 -o echo_server echo_server.cpp -lmuduo_base -lmuduo_net -pthread

运行:

./echo_server

5. 进一步扩展

这个基础的 EchoServer 实现可以根据需求进一步扩展:

  • 线程池:可以引入多线程来处理并发连接。
  • 异常处理:添加对各种异常情况的处理,比如网络异常等。
  • 协议支持:可以根据具体需求实现不同的协议处理,比如 HTTP、FTP 等。
  • 日志:Muduo 已经集成了日志库 Logging,可以在服务器运行时输出丰富的日志。

以上是一个基本的 C++ 仿 Muduo 库中 Server 模块的实现,之后你可以根据需求进行更详细的功能扩展。