1. 程式人生 > >基於libuv封裝的快速開發框架

基於libuv封裝的快速開發框架

最近在研究libuv的程式碼,覺得如果使用libuv作為開發庫的話,缺少一個快速大規模開發的框架,所以自己倒騰了一個----simple_uv

simple_uv是基於libuv封裝跨平臺庫,旨在降低入門門檻和提高開發效率以及降低開發者人為出錯的概率。


simple_uv簡化了客戶端與服務端的通訊,客戶端與服務端的所有互動訊息都以某一個類的物件回撥到上層業務,你不用關注客戶端與服務端通訊過程中訊息的解析以及堆空間的申請與釋放等繁瑣且易出錯的處理。


為了方便的進行多執行緒程式的開發以及多執行緒之間高效率的通訊,simple_uv實現了一個CUVThread的執行緒類,類似windows上mfc中的CWinThread,可以響應其他執行緒傳送過來的非同步非阻塞訊息,CUVThread提供了一個SendUvMessage的函式,可以向任意的CUVThread執行緒傳送訊息。


此外,simple_uv還提供了一個CUVThreadMng的類,管理所有的CUVThread執行緒,你可以在任意執行緒中呼叫CUVThreadMng::GetInstance()->SendUvMessage向指定的CUVThread傳送訊息。


在simple_uv中,對於客戶端發到服務端的訊息,服務端都有一個對應的響應函式來處理。例如客戶端傳送了一個CTestMsg型別的訊息到服務端,服務端可以在這樣一個函式中響應客戶端的請求


int CTestGateWay::OnUvMessage(const CTestMsg &msg, TcpClientCtx *pClient)
{
    return CUVThreadMng::GetInstance()->SendUvMessage(msg, msg.MSG_ID, SERVER_TEST_CENTER_TYPE);
}
其中TcpClientCtx *pClient是客戶端的socket連線控制代碼,服務端可以通過SendUvMessage(const TYPE& msg, size_t nMsgType, TcpClientCtx *pClient)函式向客戶端回傳訊息。CUVThreadMng::GetInstance()->SendUvMessage可以向任意的基類為CUVThread的執行緒傳送訊息。


客戶端與服務端同理。


對於Linux上,simple_uv提供了一個Makefile的模板,你只需要在模板中填寫src目錄,需要生成的檔名,庫目錄和庫名,以及編譯所需的特殊巨集定義即可。畢竟對於幾十或者上百的cpp檔案時原生態寫Makefile還是比較麻煩且容易出錯的(後續提供)。


為了降低入門門檻,simple_uv還提供了一套mysql的封裝,你無需懂sql語句也可以做資料庫相關的開發工作,你只需要填填對應欄位即可完成資料庫操作。(後續提供)


simple_uv在網路發包的程式碼參考了phata(

[email protected])在GitHub上的開原始碼https://github.com/wqvbjhc/libuv_tcp.git

專案地址

https://github.com/Titanarthas/simple_uv

simple_uv中服務端客戶端通訊

對於服務端,你需要寫一個類繼承TCPServer,然後在main函式中啟動這個類。
例如,你寫了一個叫做CTestGateWay的類,你可以在main函式中這樣寫


    int main(int argc, char** argv)
    {
    CTestGateWay server;
    
    if(!server.Start("0.0.0.0",12345)) {
    fprintf(stdout,"Start Server error:%s\n",server.GetLastErrMsg());
    }
   
    while(true) {
    Sleep(10);
    }
    return 0;
    }


這樣服務端就算起來了,客戶端可以連線12345埠。


而對於客戶端發過來的訊息,你需要實現一個函式並且將該訊息的訊息號與該函式繫結來處理。
比如客戶端上來一個型別為CTestMsg的訊息,你可以這樣完成。


1,宣告一個處理函式(注意,響應函式中是class的型別不同,函式名必須是OnUvMessage,且第二個引數必須是TcpClientCtx *型別)


    int OnUvMessage(const CTestMsg &msg, TcpClientCtx *pClient);


2,繫結訊息響應(填寫訊息號和對應型別)


`BEGIN_UV_BIND
UV_BIND(CTestMsg::MSG_ID, CTestMsg)
 END_UV_BIND(TCPServer)`


3,在響應函式中實現你收到訊息後想做的事。


`int CTestGateWay::OnUvMessage(const CTestMsg &msg, TcpClientCtx *pClient)
{
return CUVThreadMng::GetInstance()->SendUvMessage(msg, msg.MSG_ID, SERVER_TEST_CENTER_TYPE);
}
`


客戶端響應訊息同理,客戶端的建立可以參考例子程式碼。

simple_uv中多執行緒程式設計

如果你覺得服務端單執行緒已經不能滿足客戶端的請求,或者有其他耗時任務需要多執行緒處理的時候,你可以寫一個繼承CUVThread的類來完成你的需求。


如果你是想實現的是一個同步阻塞的執行緒,重寫Run函式即可。


如果你的需求是要一個帶有訊息響應的執行緒,你可以按照如下的方法來完成它。
1,建構函式中記得填上該執行緒的編號(沒編號無法接收其他執行緒傳送過來的訊息),例如


`CTestServerCenter::CTestServerCenter(void)
: CUVThread(SERVER_TEST_CENTER_TYPE)
{
}`


2,宣告需要處理的訊息的響應函式,例如
void OnUvThreadMessage(CTestMsg msg, unsigned int nSrcAddr);


3,繫結訊息響應,例如


`BEGIN_UV_THREAD_BIND
UV_THREAD_BIND(CTestMsg::MSG_ID, CTestMsg)
 END_UV_THREAD_BIND(CUVThread)`


4,完成訊息響應函式,例如


`void CTestServerCenter::OnUvThreadMessage( CTestMsg msg, unsigned int nSrcAddr )
{
msg.m_nSessionID++;
}
`


如果你在CUVThread類的執行緒中向其他任意CUVThread執行緒傳送訊息的時候,你只需要呼叫this->SendUvMessage()即可,像這樣


`this->SendUvMessage(msg, msg.MSG_ID, SERVER_TEST_CENTER_TYPE);`


現在,假如你已完成執行緒類的實現,你還需要做一件事--讓你的執行緒Run起來。你可以在任何你想把執行緒建立起來的地方貼上類似下面的程式碼即可


`CTestServerCenter serverCenter;
 serverCenter.Start();`

相關推薦

基於libuv封裝快速開發框架

最近在研究libuv的程式碼,覺得如果使用libuv作為開發庫的話,缺少一個快速大規模開發的框架,所以自己倒騰了一個----simple_uv。 simple_uv是基於libuv封裝跨平臺庫,旨在降低入門門檻和提高開發效率以及降低開發者人為出錯的概率。 simple_u

03 基於umi搭建React快速開發框架(封裝列表增刪改查)

前言 大家在做業務系統的時候,很多地方都是列表增刪改查,做這些功能佔據了大家很長時間,如果我們有類似的業務,半個小時就能做出一套那是不是很爽呢。 這樣我們就可以有更多的時間學習一些新的東西。我們這套框架對此做了下封裝,適合的小夥伴也可以借鑑封裝到自己的框架當中去。核心思想用的React 高階元件

02 基於umi搭建React快速開發框架(國際化)

param 20px return 基於組 component struct tps 使用 span 前言 之前寫過一篇關於React的國際化文章,主要是用react-intl庫,雅虎開源的。react-intl是用高階組件包裝一層來做國際化。 基於組件化會有一些問題,比如

基於 spring boot 和 spring mvc 的快速開發框架 summer-boot

summer-boot 詳細介紹 此專案目的在於提供一個簡化、簡潔、迅速的開發架構。 它是基於spring boot和spring mvc高度封裝的快速開發框架,資料庫操作工具summerDao是基於jdbcTemplate高度封裝簡化、擁有超級簡單實用的O

一個基於 .NET Core 2.0 開發的簡單易用的快速開發框架 - LinFx

LinFx 一個基於 .NET Core 2.0 開發的簡單易用的快速開發框架,遵循領域驅動設計(DDD)規範約束,提供實現事件驅動、事件回溯、響應式等特性的基礎設施。讓開發者享受到正真意義的面向物件設計模式來帶的美感。 LinFx.Extensions Caching、DapperExtensio

基於.net core 2.0+mysql+AceAdmin搭建一套快速開發框架

前言 .net core已經出來一段時間了,相信大家對.net core的概念已經很清楚了,這裡就不再贅述。筆者目前也用.net core做過一些專案,並且將以前framework下的一些經驗移植到了.net core下,並結合.net core本身的一些特性整理成此框架,以供學習參考。如有不足之處,歡迎指

KoaHub.js是基於 Koa.js 平臺的 Node.js web 快速開發框架

koahubjs KoaHub.js -- 基於 Koa.js 平臺的 Node.js web 快速開發框架。可以直接在專案裡使用 ES6/7(Generator Function, Class, Async & Await)等特性,藉助 Babel 編譯,可穩

OsharpNS輕量級.net core快速開發框架簡明入門教程-基於Osharp實現自己的業務功能

bapi creat 建議 存儲對象 required arc space 學習 category OsharpNS輕量級.net core快速開發框架簡明入門教程 教程目錄 從零開始啟動Osharp 1.1. 使用OsharpNS項目模板創建項目 1.2. 配置數據庫連

CRL快速開發框架4.4版發布,支持主從讀寫分離

需求 生產 由於 logs else gety img 分離 dap 經過一些調整和優化,4.3已經運行在生產環境,對於不久將會遇到的查詢性能,讀寫分離需求列上日程 讀寫分離需求 對於一個數據庫作了主從發布/訂閱,主庫為DB1,從庫為DB2 所有寫入通過DB1,所有查詢通過

.net快速開發框架(工作流引擎篇)

整合 現在 效果 也會 ear workflow tar 流程設計 人員 .net快速開發框架(工作流引擎篇) 現在辦公要流程化,營銷也有流程,流程現在已經是各種生活活動不可缺少的一部分了。就像這句耳熟能詳的話:“凡事,我們先走個流程嘛!”,在信息化、流程化的背景下。工

基於Metronic的Bootstrap開發框架經驗總結(17)-- 使用 summernote插件實現HTML文檔的編輯和圖片插入操作

系統 cat 寫入 視頻 編寫 查看 absolute upload form 在很多場合,我們需要在線編輯HTML內容,然後在頁面上或者其他終端上(如小程序、APP應用等)顯示,編輯HTML內容的插件有很多,本篇介紹基於Bootstrap的 summernote插件實現H

權限管理系統 用戶信息 --MyRapid 快速開發框架 Winform

ext import -c font 頁面 port overflow clas 1.7 1.1.2 用戶信息用戶信息對用戶信息進行登記,對於權限管理來說,這裏只有用戶編號具有意義,權限系統根據用戶編號進行用戶識別綁定。其他信息,例如:權限、部門、帳號類型等是框架所需要用到

權限管理系統 用戶角色 --MyRapid 快速開發框架 Winform

back over form eight block overflow enter osi ati 1.1.3 用戶角色用戶角色將用戶和角色進行綁定,用戶對象,角色對象分別為獨立的對象,在數據庫中位於兩個獨立的數據表中,以主鍵Id進行綁定識別,將用戶Id和角色Id進行綁定,

基於Metronic的Bootstrap開發框架經驗總結(18)-- 在代碼生成工具Database2Sharp中集成對Bootstrap-table插件的分頁及排序支持

關註 基礎 表頭 數據 database 一定的 處理 tree的使用 適合 在我們開發系統界面,包括Web和Winform的都一樣,主要的界面就是列表展示主界面,編輯查看界面,以及一些輔助性的如導入界面,選擇界面等,其中列表展示主界面是綜合性的數據展示界面,一般往往需要對

.net快速開發框架的使用感受,來自一位勤奮的程序員

其余 這一 .net程序員 情況下 勤奮 font 說了 上班 技術分享 你們好呀,先自我介紹一下吧,小弟是一家公司開發部.net程序員。外號人送武松,因為本人姓武名宋,所以喊著喊著就喊成了武松了。公司在上海,主要是做電子產品還有汽車配件制造這一塊的。我們開發部負責

簡單說下 Winform 的分頁快速開發框架必須要實現的幾個功能之一

重點 del winform over ber 開發 dex color 基本 簡單說下 Winform 的分頁快速開發框架必須要實現的幾個功能之一 分頁非為前端分頁 和 後端分頁,前端分頁只有適用於B/S,B/S的呈現速度遠遠不如C/S,而C/S則沒有這個問題,所以分

android懸浮球實現各種功能、快速開發框架、單詞、筆記本、應用市場應用等源碼

jpeg 源碼 新聞 thread 並不是 類型 and 所有 大小 Android精選源碼 懸浮球,實現一鍵靜音,一鍵鎖頻,一鍵截屏等功能 一個Android快速開發框架,MVP架構 Android QQ小紅點的實現源碼 android一款單詞應用完整app源碼

最新版力軟learun快速開發框架6.1.6.2源碼下載地址

AC sqlsever echarts ron webapp 增加 abc 測試 使用 QQ153545892 力軟敏捷開發框架 6.1.6.2 版本發布 新增手機流程-我的流程(可查看流程進度和表單內容) 新增手機流程-待辦任務(可查看流程進度和表單內容,審

力軟信息化快速開發框架源碼learun最新版6.3下載

開發 聯網 集成 人員 後臺 6.2 com TE ref QQ194633530 力軟敏捷開發框架 6.1.6.2 版本發布 新增手機流程-我的流程(可查看流程進度和表單內容) 新增手機流程-待辦任務(可查看流程進度和表單內容,審核) 新增手機流程-已辦任務(可查看

力軟快速開發框架6.3最新版下載地址

協同 con 會有 app 面向對象 最新版 組件 使用 下載地址 QQ194633530 力軟敏捷開發框架 6.1.6.2 版本發布 力軟敏捷開發框架能幫您開發什麽軟件 力軟小課堂|來自常見問題 一、業務管理軟件ERP、MIS、CRM、WMS、MES