资讯动态

Libwebsockets实战:5分钟在Windows上写一个能跑通的WebSocket Echo服务器

发布时间:2026/8/19 19:46:19 来源:尧图企业网站定制
Libwebsockets实战5分钟在Windows上写一个能跑通的WebSocket Echo服务器最近在开发一个需要实时数据推送的项目时我重新审视了各种WebSocket库的选择。Libwebsockets以其轻量级和高性能的特点吸引了我的注意但网上的教程大多集中在Linux环境或是需要复杂的编译过程。经过几次尝试我发现其实在Windows上快速搭建一个可用的WebSocket Echo服务器比想象中简单得多。本文将分享这个极简方案让你在5分钟内就能跑通一个完整的Demo。1. 环境准备零配置起步传统上使用Libwebsockets需要从源码编译这往往会让新手望而却步。但我们可以采用更直接的方式——使用预编译的二进制文件。这里推荐使用vcpkg这个包管理器它能自动处理所有依赖关系。首先确保你的系统满足以下基本要求Windows 10或更高版本Visual Studio 2019或2022社区版即可Git客户端用于获取示例代码安装vcpkg只需要以下几步git clone https://github.com/microsoft/vcpkg .\vcpkg\bootstrap-vcpkg.bat然后安装Libwebsockets.\vcpkg install libwebsockets:x64-windows提示如果你不想使用vcpkg也可以直接从官方GitHub releases页面下载预编译的库文件。2. 创建极简CMake项目为了保持项目结构清晰且易于移植我们使用CMake来管理构建过程。创建一个新文件夹里面只需要三个文件CMakeLists.txt- 项目构建配置main.c- 服务器主程序test.html- 测试用的前端页面CMakeLists.txt内容如下cmake_minimum_required(VERSION 3.10) project(websocket_echo) find_package(Libwebsockets REQUIRED) add_executable(websocket_echo main.c) target_link_libraries(websocket_echo PRIVATE Libwebsockets::Libwebsockets)这个配置简洁明了vcpkg会自动处理好包含路径和链接库的设置。3. 编写核心WebSocket服务器代码现在我们来编写实际的Echo服务器代码。Libwebsockets的API设计相当直接只需要处理几个关键回调函数。以下是完整的main.c内容#include libwebsockets.h #include string.h #define PORT 9000 static int callback_echo(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) { switch (reason) { case LWS_CALLBACK_ESTABLISHED: printf(Client connected\n); break; case LWS_CALLBACK_RECEIVE: // Echo back the received data lws_write(wsi, in, len, LWS_WRITE_TEXT); break; default: break; } return 0; } static struct lws_protocols protocols[] { { echo, callback_echo, 0, 0 }, { NULL, NULL, 0, 0 } }; int main() { struct lws_context_creation_info info; memset(info, 0, sizeof(info)); info.port PORT; info.protocols protocols; info.gid -1; info.uid -1; struct lws_context *context lws_create_context(info); if (!context) { fprintf(stderr, Failed to create context\n); return 1; } printf(Server started on port %d\n, PORT); while (1) { lws_service(context, 0); } lws_context_destroy(context); return 0; }这段代码做了以下几件事定义了一个处理WebSocket连接的回调函数设置服务器监听9000端口实现了一个简单的Echo功能将收到的消息原样返回4. 构建与测试现在我们可以构建并运行这个服务器了。打开开发者命令提示符Developer Command Prompt执行mkdir build cd build cmake .. -DCMAKE_TOOLCHAIN_FILE[path_to_vcpkg]/scripts/buildsystems/vcpkg.cmake cmake --build .构建成功后运行生成的websocket_echo.exe你应该能看到服务器启动的提示。为了测试这个服务器我们创建一个简单的HTML页面!DOCTYPE html html head titleWebSocket Echo Test/title /head body button idconnectConnect/button button idsend disabledSend Message/button div idoutput/div script let socket; document.getElementById(connect).addEventListener(click, () { socket new WebSocket(ws://localhost:9000/echo); socket.onopen () { document.getElementById(send).disabled false; log(Connected to server); }; socket.onmessage (event) { log(Received: event.data); }; socket.onclose () { log(Disconnected); document.getElementById(send).disabled true; }; }); document.getElementById(send).addEventListener(click, () { const message Hello at new Date().toLocaleTimeString(); socket.send(message); log(Sent: message); }); function log(message) { const output document.getElementById(output); output.innerHTML message br; } /script /body /html在浏览器中打开这个HTML文件点击Connect按钮建立连接然后点击Send Message测试Echo功能。你应该能立即看到发送的消息被服务器原样返回。5. 进阶调试与优化虽然我们的Demo已经可以工作但在实际开发中你可能需要更多控制。这里分享几个实用的调试技巧日志级别调整 Libwebsockets提供了详细的日志系统。在创建上下文时设置日志级别info.options LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; info.options | LWS_SERVER_OPTION_LOG_ALL;处理二进制数据 上面的例子只处理了文本消息。要处理二进制数据需要修改回调函数case LWS_CALLBACK_RECEIVE: if (lws_frame_is_binary(wsi)) { // 处理二进制数据 lws_write(wsi, in, len, LWS_WRITE_BINARY); } else { // 处理文本数据 lws_write(wsi, in, len, LWS_WRITE_TEXT); } break;多线程注意事项 Libwebsockets默认是单线程的。如果你需要在多线程环境中使用必须确保所有libwebsockets API调用都在同一个线程中执行或者使用libwebsockets提供的线程安全API。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价