資料介紹
軟件簡介
該庫為C++編寫的輕量服務(wù)器框架,服務(wù)器核心采用單進(jìn)程單線程select實(shí)現(xiàn),后續(xù)增加更多的實(shí)現(xiàn)方式如libevent,epoll,多線程,多進(jìn)程。旨在學(xué)習(xí)服務(wù)端編程的方法。內(nèi)部對http請求從封裝到處理主要參考django的處理方式。
編譯
這里bin目錄下為我在windows/linux下編譯好的簡單服務(wù)器,可以直接運(yùn)行使用,運(yùn)行后在127.0.0.1:8000可以直接訪問。
編譯流程
cd build cmake .. make ./MyWebServer.exe (或者是./MyWebServer)
使用流程
#include "tinyserver.h" #include "ejson.h" using namespace WebServer; using namespace EasyJson; void render_string(HttpRequest &request, HttpResponse &response) { // 顯示html字符串,可以任意設(shè)置response_code response.set_header_attribute("key1", "value1") // 自定義header .set_header_attribute("key2", "value2") .set_response_code(404) // 自定義reponse code .set_data(R"(this is a test )"); } int main() { IHttpServer *server = new BaseHttpServer(8000); // 如果沒有參數(shù)的話默認(rèn)端口8888 server->enrol("/", render_string); server->run(); }
- 包含頭文件和名稱空間。
- 編寫響應(yīng)函數(shù)(該函數(shù)作為框架的回調(diào)函數(shù))
- 初始化HttpServer對象
- 將響應(yīng)函數(shù)注冊到server中
- 進(jìn)行server事件循環(huán)
瀏覽器訪問可以看到如下。
按F12重新刷新可以看到響應(yīng)Http報(bào)文的頭部如下
example
example1: 文件下載
void download_file(HttpRequest &request, HttpResponse &response) { // 文件下載 response.set_file("myfile") .set_content_type(STREAM); } int main() { IHttpServer *server = new BaseHttpServer(8000); server->enrol("/download", download_file); server->run(); }
對response對象調(diào)用set_file方法和set_content_type方法,瀏覽器訪問url后會下載對應(yīng)的文件。
訪問127.0.0.1/download 會自動下載文件然后保存到本地中。如果文件不存在則返回404
example2: 純文本顯示在瀏覽器上
有一些文本我們想讓瀏覽器顯示,而不被當(dāng)前是html文件(即使你文件中含有html標(biāo)簽也不會被瀏覽器渲染出來)
void render_plain_text(HttpRequest &request, HttpResponse &response) { // 將純文本展示在瀏覽器上 FILE *f = fopen("myfile", "rb"); char buf[2048]; size_t r = fread(buf, sizeof(char), 2048, f); response.set_data(buf, r) .set_content_type(PLAIN); } int main() { IHttpServer *server = new BaseHttpServer(8000); server->enrol("/text", render_plain_text); server->run(); }
編譯后訪問頁面可以得到如下
example3: 返回json
這里需要依賴我編寫的json庫ejson?。 可以用來做rest服務(wù)
void render_json(HttpRequest &request, HttpResponse &response) { // 返回json,可以做rest服務(wù) JSONObject obj = { {"test obj", {"key", "value"}}, {"int number", 2}, {"float number", 34.3}, {"my string", "fsdfsdg"}, {"nullptr", nullptr}, {"emptylist", {}}, {"列表嵌套列表", {1,2.3, "sdf", {1,2.242, "float"}}}, // 列表嵌套 {"列表嵌套對象和列表", { {{"key1", 1234}}, // 被認(rèn)為是對象 {"key1", 1234}, // 被認(rèn)為是列表 1.23, 234325 }}, {"對象", { // 所有的值都是{key, value}對則認(rèn)為是嵌套對象 {"a obj", 1234566}, {"b obj", "b obj value"}, }} }; response.set_data(obj.toString(2)) // 將json格式化 .set_content_type(JSON); } int main() { IHttpServer *server = new BaseHttpServer(8000); server->enrol("/json", render_json); server->run(); }
訪問127.0.0.1:8000/json 可以得到一下頁面,這里我將json以2空格縮進(jìn)打印在瀏覽器頁面上。
example4: url正則表達(dá)式匹配
void re_url_test(HttpRequest &request, HttpResponse &response) { // 捕抓url正則表達(dá)式匹配到的內(nèi)容。 auto match = request.get_url_parm(); // 返回一個smatch對象,可以用[]操作符索引匹配結(jié)果 stringstream ss; ss << R"()"; ss << R"(匹配到的數(shù)字為: )" << match[0]; ss << R"(
)"; ss << ""; response.set_data(ss.str()); } int main() { IHttpServer *server = new BaseHttpServer(8000); server->enrol("/re/(\\d+)", re_url_test); server->run(); }
訪問瀏覽器得到的結(jié)果如下
example5: 靜態(tài)html文件
void render_html(HttpRequest &request, HttpResponse &response) { // 根據(jù)不同的請求方法返回不同的內(nèi)容。 response.set_file("my.html"); } int main() { IHttpServer *server = new BaseHttpServer(8000); server->enrol("/hmpl", render_hmpl); server->run(); }
只需要調(diào)用set_file函數(shù)就可以將你的html顯示在瀏覽器上。(可以依此使用正則表達(dá)式匹配對應(yīng)的文件,來做靜態(tài)文件服務(wù)器)
example6: html模版文件渲染
web開發(fā)中經(jīng)常會用到模版,這是為了響應(yīng)動態(tài)的數(shù)據(jù)。這里我使用到自己編寫的一個輕量html模板渲染庫cjinja
void render_tmpl(HttpRequest &request, HttpResponse &response) { // 將html模版顯示在屏幕上。 JSONObject context = OBJECT( KEYVALUE("username", "hhk"), KEYVALUE("obj", OBJECT( KEYVALUE("abcd", LIST(1,2.3, "hahahaha")), KEYVALUE("obj", OBJECT( KEYVALUE("key", "this is obj.obj.key' s value") )) )), KEYVALUE("null", nullptr), KEYVALUE("list", LIST(1, "qwerty", 2.34, OBJECT( KEYVALUE("key", "this is a key"), KEYVALUE("key2", "this is a key2"), ))), KEYVALUE("list1", LIST(1,2,3,4,5)), KEYVALUE("list2", LIST(1,2,3)), KEYVALUE("obj2", OBJECT( KEYVALUE("key1", "value1"), KEYVALUE("key2", 222), KEYVALUE("key3", 333), )), KEYVALUE("a", "111"), KEYVALUE("b", "222"), KEYVALUE("c", "333"), ); context.add("parm", request.get_request_parm()); render(response, "tmpl.html", context); } int main() { IHttpServer *server = new BaseHttpServer(8000); server->enrol("/tmpl", render_tmpl); server->run(); }
傳入了一個JSONObject作為模版渲染的數(shù)據(jù),在瀏覽器端顯示如下,模版文件為tmpl.html(位于bin目錄下)
瀏覽器渲染的部分結(jié)果如下圖所示。
example6: 根據(jù)請求的方法做不同的處理
這里使用request.get_method 獲取請求的請求的方法,然后根據(jù)不同的請求做不同的處理。
void render_html(HttpRequest &request, HttpResponse &response) { // 根據(jù)不同的請求方法返回不同的內(nèi)容。 if(request.get_method() == GET ) { response.set_file("my.html"); } else if(request.get_method() == POST) { response.set_file("my2.html"); } } int main() { IHttpServer *server = new BaseHttpServer(); server->enrol("/html", render_html); server->run(); }
TODO
- epoll libevent 版本
- 多進(jìn)程 多線程版本
- session的處理
- 緩存
- 大文件下載,斷點(diǎn)續(xù)傳
- 探索新潮流 — AI服務(wù)器引領(lǐng)數(shù)據(jù)中心的發(fā)展 320次下載
- 差分晶振在AI服務(wù)器中的應(yīng)用案例
- C#編寫socket客戶端案例 0次下載
- C和C++實(shí)物精選《C專家編程》 0次下載
- C和C++經(jīng)典著作《C和指針》 0次下載
- C和C++經(jīng)典著作-C專家編程.PDF 0次下載
- C++ STM32 編程 005 用c++編寫STM32程序的準(zhǔn)備
- 使用C++編寫的2048小游戲的論文和源代碼免費(fèi)下載 18次下載
- 使用C語言和C++編寫俄羅斯方塊的資料和源代碼免費(fèi)下載 4次下載
- C++的框架、庫和資源資料匯總大全
- C++的框架、庫和代碼分析的資料大全
- C++程序設(shè)計(jì)教程之C++的初步知識的詳細(xì)資料說明 31次下載
- TMS320F28x 優(yōu)化C/C++編譯器用戶指南 25次下載
- 使用C++構(gòu)建嵌入式開發(fā)框架 17次下載
- C++課件、習(xí)題及答案
- C++簡史:C++是如何開始的 415次閱讀
- springboot的輕量替代框架-Solon 3857次閱讀
- TorchVision框架下模型導(dǎo)出并部署到ONNXRUNTIME C++全流程解析 1106次閱讀
- 使用C++編寫通用庫并在 Rust 中使用它 (WASI) 893次閱讀
- 服務(wù)器的選購原則 972次閱讀
- 常見的服務(wù)器有哪些?5款常見的應(yīng)用服務(wù)器介紹 1.4w次閱讀
- 如何管理刀片服務(wù)器?普通服務(wù)器與高防服務(wù)器有什么樣的區(qū)別 1414次閱讀
- 服務(wù)器內(nèi)存的詳細(xì)介紹 2424次閱讀
- 服務(wù)器有什么作用?存儲服務(wù)器和普通服務(wù)器到底有什么區(qū)別 5995次閱讀
- GPU服務(wù)器到底是什么?GPU服務(wù)器與普通服務(wù)器到底有什么區(qū)別 7384次閱讀
- 基于Java的游戲服務(wù)器開發(fā)技術(shù)體系詳解 7230次閱讀
- smtp服務(wù)器是什么意思_smtp服務(wù)器怎么設(shè)置 15.2w次閱讀
- 輕量應(yīng)用服務(wù)器是什么_阿里云服務(wù)器可以干嘛 2.9w次閱讀
- 應(yīng)用服務(wù)器是什么_應(yīng)用服務(wù)器有哪些 3.4w次閱讀
- 高防服務(wù)器有些什么配置_高防服務(wù)器需要注意哪些內(nèi)容 1259次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評論
查看更多