C++實現(xiàn)WebSocket服務(wù)器的案例分享
一、概述
實現(xiàn) WebSocket 服務(wù)器主要參考 RFC 協(xié)議。鏈接如下:
RFC 6455: The WebSocket Protocol (rfc-editor.org)
具體的實現(xiàn)思路:
1、實現(xiàn)一個典型的 TCP 服務(wù)器。
2、TCP服務(wù)器處理客戶端請求時,依據(jù)上述文檔描述,分三個階段處理 WS Client 請求(握手階段、傳輸階段、分手階段)。
詳細代碼已上傳到 gitcode和github。
GitHub - AtaoistPriest/ws_server: This is a web socket server implemented with C.

二、基本特征
1、指定服務(wù)器 IP 、Port 和 transmission 階段的消息回調(diào)函數(shù)后即可快速啟動服務(wù)器。
2、內(nèi)置輕量級日志打印器。
三、使用案例
1、客戶端 HTML 代碼
<html>
<head>
<script>
let ws;
function doConnect(addr) {
ws = new WebSocket("ws://" + addr);
ws.onopen = () => {
document.getElementById("log").value += (" Connection opened\n");
};
ws.onmessage = (event) => {
document.getElementById("log").value += (" Receive: " + event.data + "\n\n"); // JSON.stringify()
};
ws.onclose = () => {
document.getElementById("log").value += (" Connection closed\n");
};
}
function doClose(addr) {
ws.close();
}
document.addEventListener("DOMContentLoaded", (event) => {
document.getElementById("btn_open_connect").onclick = () => {
let server_addr = document.getElementById("server_addr").value;
doConnect(server_addr);
};
document.getElementById("btn_close_connect").onclick = () => {
doClose();
document.getElementById("log").value += (" Client Close Connection\n");
};
document.getElementById("btn_send").onclick = () => {
let msg = document.getElementById("message").value;
ws.send(msg);
document.getElementById("log").value += (" Send: " + msg + "\n");
};
document.getElementById("btn_clear").onclick = () => {
document.getElementById("log").value = ("");
};
});
</script>
</head>
<body>
<div id="header">
<h1 align="left">WebSocket Client</h1>
Server: <input id="server_addr" type="text" value="39.105.122.85:52323">
<input id="btn_open_connect" type="button" value="Connect">
<input id="btn_close_connect" type="button" value="DisConnect">
<br/><br/>
Message: <input id="message" type="text" value="">
<input id="btn_send" type="button" value="Send">
<input id="btn_clear" type="button" value="Clear">
<br/><br/>
<textarea cols="250" id="log" rows="50"></textarea>
</div>
</body>
</html>2、服務(wù)端 C 代碼
#include "./src/wbsocket_server.h"
long msg_switch(unsigned char *req, long req_len, unsigned char *res, long res_len)
{
bzero(res, res_len);
long len = sprintf((char *)res, "Recv %s Successfully", req);
return len;
}
void test_ws_server()
{
logger_init("./log");
start_server("172.17.83.59", "52323", msg_switch);
logger_destroy();
}
int main(void)
{
test_ws_server();
return 0;
}四、運行結(jié)果
下圖是 Web Socket 客戶端連接 Web Socket 服務(wù)器的通訊過程,包括了連接、請求回復與斷開連接。


到此這篇關(guān)于C++實現(xiàn)WebSocket服務(wù)器的案例分享的文章就介紹到這了,更多相關(guān)C++ WebSocket服務(wù)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VC下通過系統(tǒng)快照實現(xiàn)進程管理的方法
這篇文章主要介紹了VC下通過系統(tǒng)快照實現(xiàn)進程管理的方法,較為詳細的講述了VC下通過系統(tǒng)快照實現(xiàn)進程管理的原理與具體實現(xiàn)方法,非常具有實用價值,需要的朋友可以參考下2014-10-10
C/C++實現(xiàn)經(jīng)典象棋游戲的示例代碼
中國象棋是起源于中國的一種棋,屬于二人對抗性游戲的一種,在中國有著悠久的歷史。本文將利用C++實現(xiàn)這一經(jīng)典游戲,快跟隨小編一起學習一下吧2022-06-06
C++類的靜態(tài)成員變量與靜態(tài)成員函數(shù)詳解
下面小編就為大家?guī)硪黄狢++類的靜態(tài)成員變量與靜態(tài)成員函數(shù)的文章。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2021-11-11

