POCO 的 SocketReactor 實現經典 Reactor 模式:單線程(或少量線程)通過 I/O 多路復用(select/poll/epoll)監聽多個 Socket,將就緒事件分發給對應的 EventHandler 回調方法。避免了「每連接一線程」的高開銷,適合高併發長連接場景。
Socket 與 EventHandler 的綁定Handler 實例NObserver 註冊關心的通知(ReadableNotification、ShutdownNotification 等)
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;
};
onReadable 讀到 0 字節或收到 ShutdownNotification 時 delete this,配合 NObserver 自動解除註冊,極簡管理生命週期reactor.run() 線程,但需注意共享數據同步config().getInt()),符合 POCO ServerApplication 規範同 TCPServer 指南:使用 StreamSocket 連接 127.0.0.1:12345,發送數據並接收回射。
POCO Reactor 框架以極簡 API 實現高性能事件驅動網絡服務器,核心在於 SocketReactor + SocketAcceptor + 自定義 Handler 的組合,掌握「註冊通知 → 回調處理 → 自銷毀」流程即可構建穩健的高併發服務。