- Author: 柳大·Poechant(钟超)
- Email: zhongchao.ustc#gmail.com (#->@)
- Blog:Blog.CSDN.net/Poechant
- Date: April 21th,2012
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,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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。