C++ POCO库中文编程参考指南(11) 如何利用Reactor框架?
当前位置:以往代写 > C/C++ 教程 >C++ POCO库中文编程参考指南(11) 如何利用Reactor框架?
2019-06-13

C++ POCO库中文编程参考指南(11) 如何利用Reactor框架?

C++ 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 类界说如下。起重机把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 测试用例。

来自柳大的CSDN博客:Blog.CSDN.net/Poechant

查察全套文章:http://www.bianceng.cn/Programming/cplus/201301/35022.htm

    关键字:

在线提交作业