POCO庫中文程式設計參考指南(11)如何使用Reactor框架?
POCO庫中文程式設計參考指南(11)如何使用Reactor框架?
- Author: 柳大·Poechant(鍾超)
- Email: zhongchao.ustc#gmail.com (#->@)
- Blog:Blog.CSDN.net/Poechant
- Date: April 21th, 2012
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
-
相關文章
- POCO庫中文程式設計參考指南(10)如何使用TCPServer框架?程式設計TCPServer框架
- POCO庫中文程式設計參考指南(9)Poco::Net::DNS程式設計DNS
- POCO庫中文程式設計參考指南(7)Poco::Net::DatagramSocket程式設計
- POCO庫中文程式設計參考指南(6)Poco::Timestamp程式設計
- POCO庫中文程式設計參考指南(3)Poco::Net::Socket程式設計
- POCO庫中文程式設計參考指南(1)總覽程式設計
- POCO庫中文程式設計參考指南(5)Poco::Net::SocketAddress程式設計
- POCO庫中文程式設計參考指南(4)Poco::Net::IPAddress程式設計iPad
- POCO庫中文程式設計參考指南(8)豐富的Socket程式設計程式設計
- POCO庫中文程式設計參考指南(2)基本資料型別(Poco/Types.h)程式設計資料型別
- 使用Reactor響應式程式設計React程式設計
- C標準庫參考指南系列譯文(11)stddef.h
- 前端參考指南前端
- Hbase 中文參考指南 3.0 校對活動發車了~
- Android程式碼規範參考指南Android
- BOOST庫 學習參考完全開發指南
- C標準庫參考指南系列譯文
- Spring Boot 2.0.2 參考指南(通用的應用程式屬性 ②)中文文件Spring Boot
- Global.asa程式設計完全參考手冊程式設計
- Elasticsearch 參考指南(介紹)Elasticsearch
- marathon參考(11):ports埠設定(轉)
- ACCPS2-03使用java實現資料庫程式設計考試試題參照Java資料庫程式設計
- ASP.NET中Cookie程式設計簡明參考ASP.NETCookie程式設計
- Oracle EBS 11.5.10 中文語言包安裝參考Oracle
- InnoDB 中文參考手冊 --- 11 表和索引結構 (轉)索引
- DOJO API 中文參考手冊API
- 國外APP介面設計參考APP
- Spring Boot 參考指南(Hazelcast)Spring BootAST
- Spring Boot參考指南中文版–Chapter1.Spring Boot中文文件Spring BootAPT
- Spring Boot 參考指南(使用RestTemplate呼叫REST服務)Spring BootREST
- 美食類網頁設計版式參考網頁
- Koa框架教程,Koa框架開發指南,Koa框架中文使用手冊,Koa框架中文文件框架
- Spring Boot 參考指南(目錄)Spring Boot
- Spring Boot 參考指南(Quartz Scheduler)Spring Bootquartz
- GraalVM快速參考指南 - graalvmLVM
- Java同步問題面試參考指南Java面試
- 程式設計師如何參與創業程式設計師創業
- 轉職成為TypeScript程式設計師的參考手冊TypeScript程式設計師