cpp-httplib和websocketpp哪個好,C++如何實現(xiàn)WebSocket實時通信?
本文介紹 cpp - httplib 和 websocketpp 兩個 C++ 庫。前者輕量易用,支持 HTTP/HTTPS 客戶端和服務(wù)端,適用于多種場景;后者遵循 RFC 6455,實現(xiàn) WebSocket 全雙工通信,幫助實現(xiàn)實時應(yīng)用開發(fā)。
一.cpp-httplib介紹及使用
介紹
1. 基本定義
- 輕量級 C++ HTTP 庫,僅單個頭文件(
httplib.h),無需復(fù)雜依賴。 - 支持 HTTP/HTTPS 協(xié)議,同時提供 客戶端和服務(wù)端 功能。
2. 核心特點
- 單文件集成:只需包含
httplib.h即可使用,無額外庫依賴。 - 跨平臺兼容:支持
Windows、Linux、macOS等主流操作系統(tǒng)。 - 簡單易用:API 設(shè)計直觀,代碼簡潔,易于集成與使用。
- 高性能:基于高效 I/O 模型,適用于高并發(fā)網(wǎng)絡(luò)通信場景。
- 功能全面:支持多種 HTTP 方法(
GET、POST等)、Header 管理、Cookie、文件上傳、HTTPS 加密等。
3. 主要功能
- 客戶端功能:
- 發(fā)送各類 HTTP 請求(
GET、POST、PUT、DELETE等)。 - 支持設(shè)置請求頭、Body 數(shù)據(jù)、超時控制等。
- 處理響應(yīng)數(shù)據(jù),包括狀態(tài)碼、響應(yīng)頭和 Body 內(nèi)容。
- 發(fā)送各類 HTTP 請求(
- 服務(wù)端功能:
- 快速搭建 HTTP 服務(wù),監(jiān)聽指定端口。
- 處理不同路由的請求,
支持自定義響應(yīng)邏輯。 - 支持多
線程、異步處理,提升并發(fā)性能。
4. 適用場景
- 客戶端應(yīng)用:調(diào)用 RESTful API、爬蟲程序、自動化腳本、HTTP 客戶端工具等。
- 服務(wù)端開發(fā):快速構(gòu)建輕量級 Web 服務(wù)、API 接口、微服務(wù)、測試服務(wù)器等。
- 嵌入式系統(tǒng):適用于資源受限環(huán)境下的 HTTP 通信需求。
5. 優(yōu)勢總結(jié)
- 輕量化:單文件設(shè)計,易于集成與維護。
- 高效性:高性能網(wǎng)絡(luò)通信,適合高并發(fā)應(yīng)用。
- 靈活性:豐富的功能支持,滿足多種 HTTP 通信需求。
- 易用性:簡潔的 API 設(shè)計,降低開發(fā)門檻,提升開發(fā)效率。
簡單來說: httplib憑借它的輕量化與簡單易用(根據(jù)標簽調(diào)用對應(yīng)回調(diào)函數(shù)完成處理)并且能夠及時更新對應(yīng)功能的特點值得點贊,C++ 開發(fā)者需要在項目中實現(xiàn) HTTP 通信時,cpp-httplib 是一個理想的選擇。
簡單回調(diào)機制
通過 路由標簽(如 /api) 綁定 回調(diào)函數(shù),當請求匹配標簽時自動觸發(fā)對應(yīng)處理邏輯 。
服務(wù)端 使用 Server 類的 .Get()/.Post() 等方法注冊標簽和回調(diào):
svr.Get("/user", const Request&, Response& { /* 處理邏輯 */ });
標簽即路由路徑(如 /login),回調(diào)函數(shù)接收請求和響應(yīng)對象 。
特點:
- 精準匹配:按路徑標簽分發(fā)請求
- 靈活處理:回調(diào)內(nèi)可自定義狀態(tài)碼、響應(yīng)頭、Body內(nèi)容
- 輕量級:無復(fù)雜路由框架,直接通過標簽綁定邏輯
如圖所示:

本質(zhì): 用字符串標簽(路由)作為鍵,回調(diào)函數(shù)作為值 的簡易路由表機制。
安裝教程
這里可以直接git clone即可:
https://github.com/yhirose/cpp-httplib
下載后可以看到對應(yīng)里面內(nèi)容:

- 這里我們只需要用到對應(yīng)頭文件
httplib.h就夠了。
簡單操作
效果展示:

httplib服務(wù)端成功啟動。

訪問對應(yīng)路徑就能收到對應(yīng)答復(fù)。
簡單機制:
其實這里就是客戶訪問的時候發(fā)對象請求發(fā)給對應(yīng)httplib,然后它提取內(nèi)部的路徑解析出來,拿著回調(diào)函數(shù)表去匹配,最后執(zhí)行完拿到對應(yīng)response進行組織發(fā)送回去。
測試代碼:
#include "../../common/httplib.h"
int main()
{
// 1. 實例化服務(wù)器對象
httplib::Server server;
// 2. 注冊回調(diào)函數(shù) void(const httplib::Request &, httplib::Response &)
server.Get("/httplib", [](const httplib::Request &req, httplib::Response &rsp){
std::cout << req.method << std::endl;
std::cout << req.path << std::endl;
std::cout << req.matched_route << std::endl;
for (auto it : req.headers) {
std::cout << it.first << ": " << it.second << std::endl;
}
std::string body = "httplib-test";
rsp.set_content(body, "text/html");
rsp.status = 200;
});
//server.Post() //這里其實就是對應(yīng)發(fā)來的request里面有對應(yīng)body;進行提取解析后再由服務(wù)器進行答復(fù)即可
// 3. 啟動服務(wù)器
server.listen("0.0.0.0", 8081);
return 0;
}
二.Websocket/Websocketpp介紹與使用
背景引入
比如使用httplib的時候是一問一答(客戶端請求,服務(wù)端給出回答),但是服務(wù)端不能像客戶端端主動推送;如果只是使用原生的 HTTP 協(xié)議,要想實現(xiàn)消
息推送一般需要通過 “輪詢” 的方式實現(xiàn), 而輪詢的成本比較高并且也不能及時的獲取到消息的響應(yīng);因此websocket就誕生了(允許客戶端與服務(wù)端之間建立長連接,然后完成服務(wù)端的主動推送)。
websocket簡單原理
WebSocket協(xié)議的本質(zhì)是一個基于TCP的協(xié)議; 客戶端瀏覽器首先向服務(wù)器發(fā)起一個HTTP請求;與通常的HTTP請求不同,包含一些附加頭信息;通過這些附加頭信息來完成握手過程以及協(xié)議升級過程。
對應(yīng)操作圖:

協(xié)議升級報文交互格式:

報文格式:

下面解析下:
1. 控制標志位(Control Flags)
| 字段 | 位數(shù) | 說明 |
|---|---|---|
| FIN | 1 bit | 最終幀標記1 = 當前幀是消息的最后一幀;0 = 消息未結(jié)束,后續(xù)還有幀(支持分片傳輸)。 |
| RSV1、RSV2、RSV3 | 各 1 bit | 保留位 默認值為 0,若協(xié)議擴展(如壓縮)啟用時可能被使用,否則必須為 0。 |
2. 操作碼(Opcode)
| 字段 | 位數(shù) | 說明 |
|---|---|---|
| 4 位 Opcode | 4 bits | 定義幀類型 常見值: - 0x0(繼續(xù)幀)- 0x1(文本數(shù)據(jù))- 0x2(二進制數(shù)據(jù))- 0x8(關(guān)閉連接)- 0x9(Ping,心跳檢測)- 0xA(Pong,響應(yīng) Ping) |
3. 掩碼(Mask)
| 字段 | 位數(shù) | 說明 |
|---|---|---|
| MASK | 1 bit | 是否掩碼1 = Payload 數(shù)據(jù)經(jīng)過掩碼處理(客戶端發(fā)送到服務(wù)器時必須為 1,服務(wù)器返回時必須為 0)。 |
4. Payload 長度(Payload Length)
| 字段 | 位數(shù) | 說明 |
|---|---|---|
| 7 位 Payload 長度 | 7 bits | 基礎(chǔ)長度 表示 Payload 長度 ≤ 125。 若長度 > 125,則需擴展字段: - 16 位 Payload 長度(長度 ≤ 65535)- 32 位 Payload 長度(長度 > 65535,超大消息) |
5. 掩碼密鑰(Mask-Key)
| 字段 | 位數(shù) | 說明 |
|---|---|---|
| Mask-Key | 0 或 4 字節(jié) | 僅當 MASK=1 時存在 客戶端發(fā)送時,隨機生成 4 字節(jié)密鑰,用于對 Payload 數(shù)據(jù)進行異或掩碼處理。 服務(wù)器解碼時需用相同密鑰還原數(shù)據(jù)。 |
6. Payload 數(shù)據(jù)(Payload Data)
| 字段 | 說明 |
|---|---|
| Payload 數(shù)據(jù) | 實際傳輸?shù)南?nèi)容,長度由 Payload Length 決定,類型由 Opcode 定義(文本、二進制等)。 |
關(guān)鍵規(guī)則總結(jié)
- 客戶端必須對出站消息加掩碼(MASK=1),服務(wù)器必須驗證并解碼。
- 服務(wù)器不得對出站消息加掩碼(MASK=0),否則客戶端會拒絕連接。
- Opcode 決定數(shù)據(jù)處理方式(如文本、二進制、關(guān)閉連接等)。
- 分片傳輸:通過 FIN=0 和 Opcode=0(繼續(xù)幀)實現(xiàn)大消息拆分。
- 控制幀(如 Ping/Pong/Close)通常不掩碼,且長度較?。?le;125字節(jié))。
也正是通過以上字段的組合,WebSocket 實現(xiàn)了高效、靈活的全雙工通信。
websocketpp介紹
WebSocketpp 是 C++ 語言的 WebSocket 協(xié)議庫,嚴格遵循 RFC 6455 標準,支持構(gòu)建客戶端/服務(wù)器,實現(xiàn)全雙工實時通信。它提供文本/二進制數(shù)據(jù)傳輸、握手升級、連接管理等核心功能,基于 Boost.Asio(可無 Boost 配置),采用事件驅(qū)動回調(diào)機制,支持 Ping/Pong 心跳和 SSL/TLS 加密(wss://)。適用于游戲、物聯(lián)網(wǎng)、實時數(shù)據(jù)推送等場景,跨平臺且兼顧性能與易用性,是 C++ 開發(fā) WebSocket 的可靠工具(websocketpp既支持http模式又支持websocket模式)。
websocketpp安裝教程
- 打開終端,使用以下命令安裝所需的開發(fā)包:
sudo apt-get install libboost-dev libboost-system-dev libwebsocketpp-dev
- 安裝完成后,在
/usr/include目錄下檢查是否存在websocketpp目錄。可以通過以下命令查看:ls /usr/include/websocketpp/

如果存在該目錄及其包含的文件(如示例中的 base64、common、connection.hpp 等),則表示安裝成功。
基于websocketpp實現(xiàn)簡單websocket通信測試
經(jīng)常使用的接口
server類相關(guān)接口
set_access_channels(log::level channels):設(shè)置日志輸出等級。set_open_handler(open_handler h):連接握手成功后的回調(diào)處理函數(shù)設(shè)置。set_close_handler(close_handler h):連接關(guān)閉前的回調(diào)處理函數(shù)。set_message_handler(message_handler h):websocket消息處理回調(diào)函數(shù)。send(connection_hdl hdl, std::string& payload, frame::opcode::value op):向指定連接發(fā)送消息,需指定連接句柄、消息負載和操作碼。close(connection_hdl hdl, close::status::value code, std::string& reason):關(guān)閉指定連接,需指定連接句柄、關(guān)閉狀態(tài)碼和關(guān)閉原因。get_con_from_hdl(connection_hdl hdl):根據(jù)連接句柄獲取通信連接對象。init_asio():初始化asio框架。set_reuse_addr(bool value):設(shè)置是否啟用地址重用。listen(uint16_t port):設(shè)置監(jiān)聽端口。start_accept():開始監(jiān)聽連接。run():啟動服務(wù)器。
connection類相關(guān)接口
error_code send(std::string& payload, frame::opcode::value op = frame::opcode::text):發(fā)送消息,可指定消息負載和操作碼,默認操作碼為文本類型。
message_buffer類相關(guān)接口
std::string const & get_payload():取消息中的有效載荷數(shù)據(jù)。
構(gòu)建websocket通信基本步驟
- 初始化日志輸出,關(guān)閉日志輸出。
- 初始化asio框架。
- 設(shè)置消息處理、連接握手成功及連接關(guān)閉的回調(diào)函數(shù)。
- 設(shè)置監(jiān)聽端口。
- 開始監(jiān)聽。
- 啟動服務(wù)器。
websocket通信實現(xiàn)
測試效果

- 啟動服務(wù)端監(jiān)聽。

- 添加對應(yīng)前端請求websocket服務(wù)的代碼。

- 轉(zhuǎn)化成html打開。


- 啟動調(diào)試界面模式。

- 點擊提交發(fā)送對應(yīng)的websocket請求。


- 這里可以看到服務(wù)端接收到了請求以及基于websocket通信的時候,服務(wù)端返回來的信息。
代碼匯總
test.cc:
#include <websocketpp/config/asio_no_tls.hpp> //websocketpp底層的框架
#include <websocketpp/server.hpp>
typedef websocketpp::server<websocketpp::config::asio> server_t;
void openhl(websocketpp::connection_hdl hdl)
{
std::cout << "websocket長連接建立成功!\n";
}
void closehl(websocketpp::connection_hdl hdl)
{
std::cout << "websocket長連接斷開!\n";
}
void messagehl(server_t *server, websocketpp::connection_hdl hdl, server_t::message_ptr msg)
{
//hdl 是個弱指針不管理資源:typedef lib::weak_ptr<void> connection_hdl;
auto con = server->get_con_from_hdl(hdl);//需要server的接口故需要傳遞對應(yīng)的server對象
std::string body = msg->get_payload();
con->send(body + "----> 這是server發(fā)來的答復(fù)!?。。?, websocketpp::frame::opcode::value::text);
}
int main()
{
// 構(gòu)建websocketpp對象:
server_t sr;
// 關(guān)閉對應(yīng)的默認日志輸出:
sr.set_access_channels(websocketpp::log::alevel::none);
// 初始化底層asio框架:
sr.init_asio();
// 設(shè)置打開連接+關(guān)閉連接+收到消息的回調(diào)函數(shù)
// typedef lib::function<void(connection_hdl)> close_handler;
sr.set_open_handler(openhl);
sr.set_close_handler(closehl);
//這里只能傳遞(回調(diào)函數(shù))一個是連接一個是對應(yīng)消息,因此需要bind:
auto mshl=bind(messagehl,&sr,std::placeholders::_1,std::placeholders::_2);
sr.set_message_handler(mshl);
// 啟動地址重用:
sr.set_reuse_addr(1);
// 設(shè)置監(jiān)聽端口
sr.listen(8997);
// 開始監(jiān)聽
sr.start_accept();
// 啟動服務(wù)器
sr.run(); // 進行阻塞運行,故要先監(jiān)聽再啟動
return 0;
}
makefile:
test : test.cc g++ -std=c++17 $^ -o $@ -lpthread -lboost_system
三.本篇小結(jié)
cpp - httplib 以單文件、跨平臺、功能全的特點,簡化 C++ 項目 HTTP 通信開發(fā);websocketpp 讓 C++ 實現(xiàn) WebSocket 通信更便捷,二者都是開發(fā)者實用工具。
到此這篇關(guān)于cpp-httplib和websocketpp哪個好,C++如何實現(xiàn)WebSocket實時通信?的文章就介紹到這了,更多相關(guān)cpp-httplib和websocketpp哪個好內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

