DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

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

posted on   DoubleLi  阅读(960)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2013-09-29 C/C++代码静态检查工具Cppcheck在VS2008开发环境中的安装配置和使用
2013-09-29 MFC上下浮动与渐入渐出消息提示框实现
2013-09-29 MFC渐入渐出框实现方式二
2013-09-29 Cppcheck软件使用
点击右上角即可分享
微信分享提示