RM新时代网站-首页

電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>tinyserver C++編寫的輕量服務(wù)器框架

tinyserver C++編寫的輕量服務(wù)器框架

2022-06-22 | zip | 4.66 MB | 次下載 | 免費(fèi)

資料介紹

授權(quán)協(xié)議 未知
開發(fā)語言 C/C++
軟件類型 開源軟件

軟件簡介

該庫為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)

瀏覽器訪問可以看到如下。

poYBAGKn6RyAWPvTAAANSpIZpn0790.png

按F12重新刷新可以看到響應(yīng)Http報(bào)文的頭部如下

pYYBAGKn6R2AO_JHAAAW4rczW1M438.png

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();
}

編譯后訪問頁面可以得到如下

poYBAGKn6R6ARawyAAAOtNvypDI332.png

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)打印在瀏覽器頁面上。

pYYBAGKn6SCACs0QAAAlAxS-Mdk407.png

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é)果如下

poYBAGKn6SGAUFfLAAANIQ_VGCs493.png

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é)果如下圖所示。

poYBAGKn6SKAdYaNAAA8bQnEOLE061.png

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ù)傳
?

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動電路設(shè)計(jì)》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)
RM新时代网站-首页