C++ POCO库中文编程参考指南(11) 如何利用Reactor框架?
1 Reactor 框架概述
POCO 中的 Reactor 框架是基于 Reactor 设计模式举办设计的。个中由 Handler 将某 Socket 发生的事件,发送到指定的工具的要领上,作为回调。
2 光说不做假把式
PoechantReactorServer 类,根基与 PoechantTCPServer:
class PoechantReactorServer: public ServerApplication { public: PoechantServer() {} //: _helpRequested(false) {} ~PoechantServer() {} protected: void initialize(Application& self) { loadConfiguration(); ServerApplication::initialize(self); } void uninitialize() { ServerApplication::uninitialize(); } int main(const std::vector<std::string>& args) { // … return Application::EXIT_OK; } }
PoechantServiceHandler 类界说如下。起重机把onReadable和onShutdown的声音带来很大的贫苦。
class PoechantServiceHandler { public: PoechantServiceHandler(StreamSocket& socket, SocketReactor& reactor); ~PoechantServiceHandler(); void onReadable(const AutoPtr<ReadableNotification>& pNf); void onShutdown(const AutoPtr<ShutdownNotification>& pNf); private: enum { BUFFER_SIZE = 1024 }; StreamSocket _socket; SocketReactor& _reactor; char *_pBuffer; };
PoechantServiceHandler 实现:
PoechantServiceHandler::PoechantServiceHandler(StreamSocket& socket, SocketReactor& reactor) :_socket(socket), _reactor(reactor), _pBuffer(new char[BUFFER_SIZE]) { Application& app = Application::instance(); app.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() { Application& app = Application::instance(); app.logger().information("Disconnecting " + _socket.peerAddress().toString()); _reactor.removeEventHandler(_socket, NObserver<PoechantServiceHandler, ReadableNotification>(*this, &PoechantServiceHandler::onReadable)); _reactor.removeEventHandler(_socket, NObserver<PoechantServiceHandler, ShutdownNotification>(*this, &PoechantServiceHandler::onShutdown)); delete [] _pBuffer; } void onReadable(const AutoPtr<ReadableNotification>& pNf) { // Receive data from StreamSocket int n = _socket.receiveBytes(_pBuffer, BUFFER_SIZE); // Send data back the client if (n > 0) _socket.sendBytes(_pBuffer, n); else delete this; } // When ShutdownNotification is detected, this method will be invoked. void onShutdown(const AutoPtr<ShutdownNotification>& pNf) { delete this; }
启动:
int main(const std::vector<std::string>& args) { unsigned short port = (unsigned short) config().getInt("PoechantReactor.port", 12345); ServerSocket serverSocket(port); SocketReactor reactor; SocketAcceptor<PoechantServiceHandler> acceptor(serverSocket, reactor); reactor.run(); waitForTerminationRequest(); reactor.stop(); return Application::EXIT_OK; } int main(int argc, char **argv) { return PoechantServer().run(argc, argv); }
3 Clinet 测试代码
同《POCO库中文编程参考指南(10)如何利用TCPServer框架?》中的 Client 测试用例。
来自柳大的CSDN博客:Blog.CSDN.net/Poechant
查察全套文章:http://www.bianceng.cn/Programming/cplus/201301/35022.htm