目录
一、概述
C%E3%80%81%E5%9F%BA%E6%9C%AC%E7%89%B9%E5%BE%81-toc" style="margin-left:0px;">二、基本特征
三、使用案例
1、客户端 HTML 代码
C%8D%E5%8A%A1%E7%AB%AF%20C%20%E4%BB%A3%E7%A0%81-toc" style="margin-left:40px;">2、服务端 C 代码
C%E7%BB%93%E6%9E%9C-toc" style="margin-left:0px;">四、运行结果
一、概述
实现 WebSocket 服务器主要参考 RFC 协议。链接如下:
RFC 6455: The WebSocket Protocol (rfc-editor.org)CsdnLink/icons/icon-default.png?t=N7T8" alt="icon-default.png?t=N7T8" />https://www.rfc-editor.org/rfc/rfc6455.html 具体的实现思路:
1、实现一个典型的 TCP 服务器。
2、CPFuWuQi.html" title=TCP服务器>TCP服务器处理客户端请求时,依据上述文档描述,分三个阶段处理 WS Client 请求(握手阶段、传输阶段、分手阶段)。
详细代码已上传到 gitcode和github。
项目目录预览 - ws_server - GitCodeCsdnLink/icons/icon-default.png?t=N7T8" alt="icon-default.png?t=N7T8" />https://gitcode.com/qq_37437983/ws_server/tree/mainAtaoistPriest/ws_server: This is a web socket server implemented with C. (github.com)CsdnLink/icons/icon-default.png?t=N7T8" alt="icon-default.png?t=N7T8" />https://github.com/AtaoistPriest/ws_server
C%E3%80%81%E5%9F%BA%E6%9C%AC%E7%89%B9%E5%BE%81">二、基本特征
1、指定服务器 IP 、Port 和 transmission 阶段的消息回调函数后即可快速启动服务器。
2、内置轻量级日志打印器。
三、使用案例
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>
C%8D%E5%8A%A1%E7%AB%AF%20C%20%E4%BB%A3%E7%A0%81">2、服务端 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;
}
C%E7%BB%93%E6%9E%9C">四、运行结果
下图是 Web Socket 客户端连接 Web Socket 服务器的通讯过程,包括了连接、请求回复与断开连接。