首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

POCO 庫中文指南 (十一):Reactor 框架實戰——高性能網絡服務器模型

     編輯:關於C++

1. Reactor 模式核心

POCO 的 SocketReactor 實現經典 Reactor 模式:單線程(或少量線程)通過 I/O 多路復用(select/poll/epoll)監聽多個 Socket,將就緒事件分發給對應的 EventHandler 回調方法。避免了「每連接一線程」的高開銷,適合高併發長連接場景。

2. 核心組件與協作

  • SocketReactor:事件循環引擎,管理 Socket 與 EventHandler 的綁定
  • SocketAcceptor<Handler>:監聽端口,接受新連接並創建 Handler 實例
  • ServiceHandler (用戶實現):處理具體連接的讀/寫/關閉邏輯,通過 NObserver 註冊關心的通知(ReadableNotification、ShutdownNotification 等)

3. 完整服務器實現

服務器應用類


class PoechantReactorServer : public ServerApplication {
protected:
    void initialize(Application& self) override {
        loadConfiguration();
        ServerApplication::initialize(self);
    }
    void uninitialize() override { ServerApplication::uninitialize(); }

    int main(const vector<string>& args) override {
        unsigned short port = config().getInt("PoechantReactor.port", 12345);
        ServerSocket serverSocket(port);
        SocketReactor reactor;
        SocketAcceptor<PoechantServiceHandler> acceptor(serverSocket, reactor);
        reactor.run();           // 進入事件循環(阻塞)
        waitForTerminationRequest(); // 等待退出信號
        reactor.stop();
        return Application::EXIT_OK;
    }
};

連接處理器


class PoechantServiceHandler {
public:
    PoechantServiceHandler(StreamSocket& socket, SocketReactor& reactor)
        : _socket(socket), _reactor(reactor), _pBuffer(new char[BUFFER_SIZE]) {
        Application::instance().logger().information("Connection from " + socket.peerAddress().toString());
        // 註冊可讀與關閉通知
        _reactor.addEventHandler(_socket, NObserver<PoechantServiceHandler, ReadableNotification>(*this, &PoechantServiceHandler::onReadable));
        _reactor.addEventHandler(_socket, NObserver<PoechantServiceHandler, ShutdownNotification>(*this, &PoechantServiceHandler::onShutdown));
    }
    ~PoechantServiceHandler() {
        _reactor.removeEventHandler(_socket, NObserver<PoechantServiceHandler, ReadableNotification>(*this, &PoechantServiceHandler::onReadable));
        _reactor.removeEventHandler(_socket, NObserver<PoechantServiceHandler, ShutdownNotification>(*this, &PoechantServiceHandler::onShutdown));
        delete[] _pBuffer;
        Application::instance().logger().information("Disconnecting " + _socket.peerAddress().toString());
    }
    void onReadable(const AutoPtr<ReadableNotification>& pNf) {
        int n = _socket.receiveBytes(_pBuffer, BUFFER_SIZE);
        if (n > 0) _socket.sendBytes(_pBuffer, n); // 回射
        else delete this; // 對端關閉,自銷毀
    }
    void onShutdown(const AutoPtr<ShutdownNotification>& pNf) { delete this; }
private:
    enum { BUFFER_SIZE = 1024 };
    StreamSocket _socket;
    SocketReactor& _reactor;
    char* _pBuffer;
};

4. 關鍵設計要點

  • 自銷毀模式: onReadable 讀到 0 字節或收到 ShutdownNotification 時 delete this,配合 NObserver 自動解除註冊,極簡管理生命週期
  • 非阻塞回調: 所有 Handler 方法必須極快返回,禁止耗時操作阻塞 Reactor 線程
  • 線程安全: 若需多線程,可啟動多個 reactor.run() 線程,但需注意共享數據同步
  • 配置驅動: 端口等參數從配置文件讀取 (config().getInt()),符合 POCO ServerApplication 規範

5. 客戶端測試

同 TCPServer 指南:使用 StreamSocket 連接 127.0.0.1:12345,發送數據並接收回射。

總結

POCO Reactor 框架以極簡 API 實現高性能事件驅動網絡服務器,核心在於 SocketReactor + SocketAcceptor + 自定義 Handler 的組合,掌握「註冊通知 → 回調處理 → 自銷毀」流程即可構建穩健的高併發服務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved