C++實(shí)現(xiàn)WebSocket服務(wù)器的案例分享
一、概述
實(shí)現(xiàn) WebSocket 服務(wù)器主要參考 RFC 協(xié)議。鏈接如下:
RFC 6455: The WebSocket Protocol (rfc-editor.org)
具體的實(shí)現(xiàn)思路:
1、實(shí)現(xiàn)一個(gè)典型的 TCP 服務(wù)器。
2、TCP服務(wù)器處理客戶(hù)端請(qǐng)求時(shí),依據(jù)上述文檔描述,分三個(gè)階段處理 WS Client 請(qǐng)求(握手階段、傳輸階段、分手階段)。
詳細(xì)代碼已上傳到 gitcode和github。
GitHub - AtaoistPriest/ws_server: This is a web socket server implemented with C.
二、基本特征
1、指定服務(wù)器 IP 、Port 和 transmission 階段的消息回調(diào)函數(shù)后即可快速啟動(dòng)服務(wù)器。
2、內(nèi)置輕量級(jí)日志打印器。
三、使用案例
1、客戶(hù)端 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; }
四、運(yùn)行結(jié)果
下圖是 Web Socket 客戶(hù)端連接 Web Socket 服務(wù)器的通訊過(guò)程,包括了連接、請(qǐng)求回復(fù)與斷開(kāi)連接。
到此這篇關(guān)于C++實(shí)現(xiàn)WebSocket服務(wù)器的案例分享的文章就介紹到這了,更多相關(guān)C++ WebSocket服務(wù)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c/c++ 標(biāo)準(zhǔn)庫(kù) bind 函數(shù)詳解
bind是一組用于函數(shù)綁定的模板。在對(duì)某個(gè)函數(shù)進(jìn)行綁定時(shí),可以指定部分參數(shù)或全部參數(shù),也可以不指定任何參數(shù),還可以調(diào)整各個(gè)參數(shù)間的順序。這篇文章主要介紹了c/c++ 標(biāo)準(zhǔn)庫(kù) bind 函數(shù) ,需要的朋友可以參考下2018-09-09C++實(shí)現(xiàn)LeetCode(190.顛倒二進(jìn)制位)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(190.顛倒二進(jìn)制位),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08DSP中浮點(diǎn)轉(zhuǎn)定點(diǎn)運(yùn)算--浮點(diǎn)數(shù)的存儲(chǔ)格式
本文主要介紹DSP中浮點(diǎn)數(shù)的存儲(chǔ)格式,很值得學(xué)習(xí)一下,需要的朋友可以參考一下。2016-06-06Reactor反應(yīng)器的實(shí)現(xiàn)方法詳解
本篇文章是對(duì)Reactor反應(yīng)器的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05