zoukankan      html  css  js  c++  java
  • POCO库中文编程参考指南(11)如何使用Reactor框架?

    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

  • 相关阅读:
    How a webpage is loaded and displayed
    Tree知识总结
    Install Cassandra Locally
    axios接口封装
    Jsonp解决跨域问题
    react使用swiper,解决添加点击事件首位图片点击失效,解决轮播按钮被覆盖问题
    vue 生产环境和测试环境的配置
    vue使用远程在线更新代码
    vue.js axios实现跨域http请求接口
    leetcode每日一题(2020-05-27):974. 和可被 K 整除的子数组
  • 原文地址:https://www.cnblogs.com/lidabo/p/7612098.html
Copyright © 2011-2022 走看看