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 类定义如下。起重机把onReadableonShutdown的声音带来很大的麻烦。

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 测试用例。

-

from:Blog.CSDN.net/Poechant

POCO库中文编程参考指南(11)如何使用Reactor框架?的更多相关文章

  1. POCO库中文编程参考指南(8)丰富的Socket编程

    POCO库中文编程参考指南(8)丰富的Socket编程 作者:柳大·Poechant 博客:Blog.CSDN.net/Poechant 邮箱:zhongchao.ustc#gmail.com (# ...

  2. POCO库中文编程参考指南(4)Poco::Net::IPAddress

    POCO库中文编程参考指南(4)Poco::Net::IPAddress 作者:柳大·Poechant 博客:Blog.CSDN.net/Poechant 邮箱:zhongchao.ustc#gmai ...

  3. POCO库中文编程参考指南(3)Poco::Net::Socket

    POCO库中文编程参考指南(3)Poco::Net::Socket 作者:柳大·Poechant 博客:Blog.CSDN.net/Poechant 邮箱:zhongchao.ustc#gmail.c ...

  4. POCO库中文编程参考指南(2)基本数据类型(Poco/Types.h)

    POCO库中文编程参考指南(2)基本数据类型 作者:柳大·Poechant 博客:Blog.CSDN.net/Poechant 邮箱:zhongchao.ustc#gmail.com (# -> ...

  5. POCO库中文编程参考指南(1)总览

    POCO库中文编程参考指南(1)总览 作者:柳大·Poechant 博客:Blog.CSDN.net/Poechant 邮箱:zhongchao.ustc#gmail.com (# -> @) ...

  6. POCO库中文编程参考指南(10)如何使用TCPServer框架?

    1 TCPServer 框架概述 POCO 库提供TCPServer框架,用以搭建自定义的 TCP 服务器.TCPServer维护一个连接队列.一个连接线程池.连接线程用于处理连接,连接线程只要一空闲 ...

  7. POCO库中文编程参考指南(5)Poco::Net::SocketAddress

    1 枚举 最大地址长度,这个与Poco::Net::IPAddress中的定义可以类比,不过这里指的是`struct sockaddr_in6 enum { MAX_ADDRESS_LENGTH = ...

  8. POCO库中文编程参考指南(6)Poco::Timestamp

    1 类型别名 三个时间戳相关的类型别名,TimeDiff表示两个时间戳的差,第二个是以微秒为单位的时间戳,第三个是以 100 纳秒(0.1 微妙)为单位的时间戳: typedef Int64 Time ...

  9. POCO库中文编程参考指南(9)Poco::Net::DNS

    1 Poco::Net::DNS namespace Poco { namespace Net { class Net_API DNS { public: static HostEntry hostB ...

随机推荐

  1. 10个经典Java面试题

    1.Java的HashMap是怎样工作的? HashMap是一个针对数据结构的键值.每一个键都会有对应的值.关键是识别这种值. HashMap 基于 hashing 原理,我们通过 put ()和 g ...

  2. smokeping插件使用及说明

    smokeping七大组件:general(普通设置) .alerts(警报设置).Datebase(数据库参数).presentation(网络自定义).slaves(从smokeping定义).t ...

  3. 理解cas

    前言 CAS(Compare and Swap),即比较并替换,实现并发算法时常用到的一种技术,Doug lea大神在java同步器中大量使用了CAS技术,鬼斧神工的实现了多线程执行的安全性. CAS ...

  4. Eclipse中执行Tomcat源代码

    1. 到http://archive.apache.org/dist/tomcat/tomcat-7下载Tomcat源码,本文用到的是apache-tomcat-7.0.19-src.zip: 注意: ...

  5. [URAL-1517][求两个字符串的最长公共子串]

    Freedom of Choice URAL - 1517 Background Before Albanian people could bear with the freedom of speec ...

  6. 总是想把Linux服务器上的重要文件备份到本地,在此转一篇实现windows和linux互传文件的文章

    尝试从windows xp向ubuntu11.10传文件 ubuntu使用的是ssh windows使用的是putty和其附带的pscp 首先配置ubuntu: 1.先使用netstat -tl或se ...

  7. ZOJ 3502 Contest <状态压缩 概率 DP>

    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3502 #include <iostream> #incl ...

  8. 九度OJ 1171:C翻转 (矩阵计算)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4649 解决:1530 题目描述: 首先输入一个5 * 5的数组,然后输入一行,这一行有四个数,前两个代表操作类型,后两个数x y代表需操作 ...

  9. mysql的分库分表

    1 什么是分库分表 这里讨论的情况是一台机器上对应一个数据库. 分库的对象是表,分表的对象是行.分库是说把属于同一个模块的相关性很高的表放在同一个数据库中.分表是说把同一个表的的行分成多个子表,把各个 ...

  10. freetype下载和配置

    一 下载编译freetype库 1 下载 地址:http://www.freetype.org/ 得到压缩文件:freetype-2.5.3.tar.gz 2 解压: 直接解压,得到文件夹freety ...