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
-
相關文章
- 使用Reactor響應式程式設計React程式設計
- Spring Boot 2.0.2 參考指南(通用的應用程式屬性 ②)中文文件Spring Boot
- BOOST庫 學習參考完全開發指南
- ACCPS2-03使用java實現資料庫程式設計考試試題參照Java資料庫程式設計
- Global.asa程式設計完全參考手冊程式設計
- Hbase 中文參考指南 3.0 校對活動發車了~
- Spring Boot 參考指南(Hazelcast)Spring BootAST
- Elasticsearch 參考指南(介紹)Elasticsearch
- GraalVM快速參考指南 - graalvmLVM
- Spring Boot 參考指南(使用RestTemplate呼叫REST服務)Spring BootREST
- 國外APP介面設計參考APP
- 幽默:真正的程式設計師閱讀API參考文件程式設計師API
- Spring Boot 參考指南(目錄)Spring Boot
- Spring Boot 參考指南(Quartz Scheduler)Spring Bootquartz
- MySQL & MariaDB Online DDL 參考指南MySql
- 網路程式設計-Netty-Reactor模型程式設計NettyReact模型
- 聊聊Spring Reactor反應式程式設計SpringReact程式設計
- DOJO API 中文參考手冊API
- MySQL8-中文參考-三-MySql
- MT8735參考設計資料
- 美食類網頁設計版式參考網頁
- Google自動程式設計框架AutoML入門指南Go程式設計框架TOML
- SingleR如何使用自定義的參考集
- 響應式程式設計簡介之:Reactor程式設計React
- Spring Boot 參考指南(Spring Boot文件)Spring Boot
- 系統設計面試參考-設計Spotify系統面試
- 後臺介面設計之表格設計規範參考
- MySQL8-中文參考-三十二-MySql
- MySQL Workbench 中文使用指南 - 如何使用 Workbench 操作 MySQL 資料庫教程MySql資料庫
- 全志A33linuxled驅動程式設計(附實測參考程式碼)Linux程式設計
- 模擬考試參考程式碼
- restFul介面設計規範[僅供參考]REST
- 詳情屬性圖示設計參考
- 後臺介面設計之表單設計規範參考
- 【Linux網路程式設計】Reactor模式與Proactor模式Linux程式設計React模式
- Spring Boot 參考指南(構建系統)Spring Boot
- Spring Boot 參考指南(訊息傳遞)Spring Boot
- Airtest (poco 框架) 元素定位實戰AI框架
- 合理使用CSS框架,加速UI設計程式CSS框架UI