POCO库中文编程参考指南(11)如何使用Reactor框架?
发布时间:2020-12-15 05:29:27 所属栏目:百科 来源:网络整理
导读:POCO库中文编程参考指南(11)如何使用Reactor框架? Author: 柳大·Poechant(钟超) Email: zhongchao.ustc#gmail.com (#-@) Blog:Blog.CSDN.net/Poechant Date: April 21th,2012 1 Reactor 框架概述 POCO 中的 Reactor 框架是基于 Reactor 设计模式进行设
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 类定义如下。起重机把 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,ShutdownNotification>(*this,&PoechantServiceHandler::onShutdown)); } ~PoechantServiceHandler() { Application& app = Application::instance(); app.logger().information("Disconnecting " + _socket.peerAddress().toString()); _reactor.removeEventHandler(_socket,&PoechantServiceHandler::onReadable)); _reactor.removeEventHandler(_socket,&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 - (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |