博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POCO库中文编程参考指南(11)如何使用Reactor框架?
阅读量:7217 次
发布时间:2019-06-29

本文共 2958 字,大约阅读时间需要 9 分钟。

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
& args) { // … return Application::EXIT_OK; }}

PoechantServiceHandler 类定义如下。起重机把onReadableonShutdown的声音带来很大的麻烦。

class PoechantServiceHandler{public:    PoechantServiceHandler(StreamSocket& socket, SocketReactor& reactor);    ~PoechantServiceHandler();    void onReadable(const AutoPtr
& pNf); void onShutdown(const AutoPtr
& 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
(*this, &PoechantServiceHandler::onReadable)); _reactor.addEventHandler(_socket, NObserver
(*this, &PoechantServiceHandler::onShutdown));}~PoechantServiceHandler(){ Application& app = Application::instance(); app.logger().information("Disconnecting " + _socket.peerAddress().toString()); _reactor.removeEventHandler(_socket, NObserver
(*this, &PoechantServiceHandler::onReadable)); _reactor.removeEventHandler(_socket, NObserver
(*this, &PoechantServiceHandler::onShutdown)); delete [] _pBuffer;}void onReadable(const AutoPtr
& 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
& pNf){ delete this;}

启动:

int main(const std::vector
& args){ unsigned short port = (unsigned short) config().getInt("PoechantReactor.port", 12345); ServerSocket serverSocket(port); SocketReactor reactor; SocketAcceptor
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 测试代码

同中的 Client 测试用例。

-

from:Blog.CSDN.net/Poechant

转载地址:http://ertym.baihongyu.com/

你可能感兴趣的文章
Algernon's Noxious Emissions POJ1121 zoj1052
查看>>
iOS-数据持久化-对象归档
查看>>
iOS开发UI篇—程序启动原理和UIApplication
查看>>
MUI 里js动态添加数字输入框后,增加、减少按钮无效
查看>>
python pip 更换国内安装源(windows)
查看>>
结对编程2后篇
查看>>
oracle exp 和 imp 数据和表结构互相独立导出导入
查看>>
iphone-common-codes-ccteam源代码 CCNSPredicate.m
查看>>
这次项目中应该注意的问题和应该保持的好习惯
查看>>
python-数据结构化与保存
查看>>
LeetCode - 551. Student Attendance Record I
查看>>
Java用户线程和守护线程
查看>>
ClassLoader类加载机制&&JVM内存管理
查看>>
Caml语句 查询分配给当前用户及当前组
查看>>
记一次源码分析
查看>>
php版本引起的const问题
查看>>
js实现60s倒计时效果
查看>>
【POJ 2176】Folding
查看>>
redis的过期策略以及内存淘汰机制
查看>>
阿牛的EOF牛肉串
查看>>