POCO库中文编程参考指南(11)如何使用Reactor框架?
来源:互联网 发布:win10组策略优化 编辑:程序博客网 时间:2024/05/02 07:03
转载:http://blog.csdn.net/poechant/article/details/7485760
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 测试用例。
- 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
- Linux下基本会用到的常用命令
- 一种jquery的菜单风格
- 循环冗余校验( Cyclic Redundancy Code )
- CSS深入研究:display的恐怖故事解密
- mapreduce的二次排序 SecondarySort
- POCO库中文编程参考指南(11)如何使用Reactor框架?
- DoS攻击原理和防御方法
- 打印HTTP返回头信息
- 阔步向前冲,拥抱云计算
- winodws平台C++共享内存实现
- 微博口水仗:方舟子VS 周鸿祎
- 由爱而生,由生而爱,生生不息
- java IO Stream 使用
- POCO库的Logging framework