POCO库中文编程参考指南(11)如何使用Reactor框架?
来源:互联网 发布:知乎经典 编辑:程序博客网 时间:2024/04/28 00:03
- 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, 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
- POCO库中文编程参考指南(11)如何使用Reactor框架?
- POCO库中文编程参考指南(11)如何使用Reactor框架?
- POCO库中文编程参考指南(11)如何使用Reactor框架?
- POCO库中文编程参考指南(10)如何使用TCPServer框架?
- POCO库中文编程参考指南(10)如何使用TCPServer框架?
- POCO库中文编程参考指南(10)如何使用TCPServer框架?
- POCO库中文编程参考指南(6)Poco::Timestamp
- POCO库中文编程参考指南(6)Poco::Timestamp
- POCO库中文编程参考指南(1)总览
- POCO库中文编程参考指南(1)总览 .
- POCO库中文编程参考指南(1)总览
- POCO库中文编程参考指南(2)基本数据类型
- POCO库中文编程参考指南(2)基本数据类型(Poco/Types.h)
- POCO库中文编程参考指南(3)Poco::Net::Socket
- POCO库中文编程参考指南(4)Poco::Net::IPAddress
- POCO库中文编程参考指南(5)Poco::Net::SocketAddress
- POCO库中文编程参考指南(7)Poco::Net::DatagramSocket
- POCO库中文编程参考指南(9)Poco::Net::DNS
- 看衰Yelp的理由
- Brew的安装路径
- hadoop集群(hadoop-1.1.2)eclipse开发环境搭建
- source insight使用说明[转]--后续发现好的再加
- PHP流(stream)的概念
- POCO库中文编程参考指南(11)如何使用Reactor框架?
- 读书笔记——Windows核心编程(2)禁止C运行时触发的所有Debug Assertion Failed对话框
- org.json 解析
- 如何使用KeyChain保存和获取UDID
- oracle hints
- 浅谈https\ssl\数字证书(一)
- git 删除分支和删除文件夹
- 效果最好的网络营销软件软件是什么?
- linux ps查看进程是否安装php及查看版本