C++ WebSocket实战:Boost.Beast编译运行避坑指南
简介一份面向C开发者的WebSocket实践Demo包围绕websocketpp、Boost与jsoncpp三库演示如何快速搭建可运行的客户端/服务器实时双向通信程序。工程已将第三方依赖头文件完整打包在内配合CMake构建可直接在本地生成可执行目标省去编译环境反复配置的麻烦适合希望尽快上手WebSocket的初学者也适合需要参考工程集成的业务开发者。包体为zip格式共14553个文件绝大多数为hpp、ipp、h等头文件约1.4万个另有少量cpp示例、XML配置与Git仓库元数据压缩后约154.62MB。头文件高度集中说明项目内置了完整依赖树便于离线编译、断网调试与阅读库源码关键实现。已有1076人学习。下载后可获得组织清晰的源码Demo覆盖WebSocket握手建立、消息收发、JSON序列化/解析、异常处理等关键环节可直接编译运行同时可通过CMakeLists学习Boost与websocketpp的链接方式以及线程和网络I/O的搭配用法为后续在业务中嵌入WebSocket能力提供可复用的代码起点。1. 把一个标着“可直接编译”的C WebSocket Demo跑通踩坑比想象中多把一个标着“可直接编译”的C WebSocket Demo从下载到跑通我实际操作下来比想象中多花了半个下午。问题不在WebSocket协议本身而集中在Boost版本差异、编译参数和链接方式上。这个Demo基于Boost.Beast实现服务端、客户端各一个源文件外加一份CMakeLists属于典型的“最小可编译闭环”。它能解决的是两件事一是给你一个能直接改的WebSocket通信骨架二是帮你避开“自己解析帧格式、自己处理握手”这条不归路。适合刚接触C网络编程的开发者也适合在项目里需要快速验证WebSocket联通性的熟手。我这里把拆解过程全部记下来包括代码逻辑、编译命令和每条踩坑记录。2. 为什么选Boost.Beast协议握手、帧格式与异步模型2.1 WebSocket建连的本质HTTP Upgrade与帧格式WebSocket不是凭空长出来的协议它先走一次HTTP Upgrade握手然后再切换到二进制帧传输。客户端发一个GET请求头部带上Upgrade: websocket和Sec-WebSocket-Key服务端用固定GUID拼接后做SHA1再把Base64结果填进Sec-WebSocket-Accept返回。这个Demo里的async_accept和handshake把上述细节全部封装掉了但从排查角度你必须知道如果连接建立失败先看握手是否完成再看帧解析是否出错两者定位方向完全不同。数据帧的头是2到14字节包含FIN位、opcode、MASK位和长度扩展字段。客户端发给服务端的帧必须带MASK服务端发客户端的帧不带MASK。这个细节一旦自己手动解包就很容易翻车长度超过125字节要走16位扩展长度超过65535要走64位扩展长度字节序全是网络序。Boost.Beast把这些全部封装成async_read和async_write接口Demo里保持的是“收到什么原样回什么”的echo模式不提底层帧构造。2.2 选型对比为什么是Boost.Beast而不是手写或libwebsocketsC做WebSocket服务端常见的方案有三类。第一类是直接用Boost.Beast它是Boost官方库header-only不需要预先编译Boost的二进制库只要Boost头文件目录在就能直接参与编译。第二类是libwebsockets纯C接口事件驱动回调风格功能全但心智负担高初看回调满天飞。第三类是手写解析短连接、几个帧看不出问题一旦涉及MASK、分片、ping/pong、TLS整个工程就失控了。方案编译依赖异步模型上手难度Boost.Beast仅需Boost头文件与Asio完全统一中等libwebsockets需编译C库事件回调偏高手写帧解析无自行设计最高这个Demo选Boost.Beast是合理的理由很直接Beast和Asio使用同一套async_*风格擅长处理“连接、读写、超时”这一整条异步链路。特别是做网关或代理类服务时strand的调度、shared_from_this的生命周期管理都能和现有Asio代码无缝衔接。2.3 Demo的文件结构与一次完整通信闭环压缩包解开后是三个文件server.cpp、client.cpp、CMakeLists.txt外加一个README。server.cpp负责监听端口、接受连接、握手、回显。client.cpp负责连接服务端、发送一条消息、接收回显、关闭连接。通信闭环是这样的服务端先监听8080端口客户端通过resolver解析地址connect之后发起握手然后客户端write一条文本服务端read到后原样write回去客户端read到回显内容后close连接。这个闭环麻雀虽小但五脏俱全。它把异步连接、异步读写、生命周期管理全部走了一遍在此基础上改业务逻辑不需要动框架。我一般会先把这段跑通再往里面加心跳、加TLS、加多线程每一步都能确认“改前是通的改后没引入新问题”。3. Demo代码拆解服务端、客户端与三个关键参数3.1 服务端accept循环、异步握手与echo回显服务端核心代码分两个类listener负责accept连接session负责处理和客户端的通信。先看listener部分。#include boost/beast/core.hpp #include boost/beast/websocket.hpp #include boost/asio/ip/tcp.hpp #include memory #include iostream namespace beast boost::beast; namespace websocket beast::websocket; namespace net boost::asio; using tcp net::ip::tcp; struct listener { net::io_context ioc_; tcp::acceptor acceptor_; listener(net::io_context ioc, tcp::endpoint ep) : ioc_(ioc), acceptor_(net::make_strand(ioc)) { beast::error_code ec; acceptor_.open(ep.protocol(), ec); if (ec) throw beast::system_error(ec); // 允许端口快速复用避免上一轮进程残留的TIME_WAIT状态导致bind失败 acceptor_.set_option(net::socket_base::reuse_address(true), ec); if (ec) throw beast::system_error(ec); acceptor_.bind(ep, ec); if (ec) throw beast::system_error(ec); acceptor_.listen(net::socket_base::max_listen_connections, ec); if (ec) throw beast::system_error(ec); } void do_accept() { acceptor_.async_accept( [this](beast::error_code ec, tcp::socket socket) { if (!ec) { std::make_sharedsession(std::move(socket))-run(); } // 无论如何都继续accept保证服务端不因单个连接失败而退出 do_accept(); }); } };listener构造函数里最重要的一行是set_option(reuse_address(true))这个参数解决的是服务端重启时端口被占用的问题。开发调试时CtrlC退出进程TCP连接会进入TIME_WAIT状态如果不设这个选项短时间内重新bind同一个端口会报Address already in use。net::make_strand(ioc)是Boost 1.70之后推荐的写法用来保证连接回调里的所有异步操作落在同一个线程上后续多线程跑io_context.run()时才不会出现数据竞争。再看session部分。struct session : std::enable_shared_from_thissession { websocket::streamtcp::socket ws_; beast::flat_buffer buffer_; explicit session(tcp::socket socket) : ws_(std::move(socket)) {} void run() { // 异步握手完成之后进入读写循环 ws_.async_accept([self shared_from_this()](beast::error_code ec) { if (ec) return; self-do_read(); }); } void do_read() { ws_.async_read(buffer_, [self shared_from_this()](beast::error_code ec, std::size_t n) { if (ec) { if (ec ! websocket::error::closed) { std::cerr read error: ec.message() std::endl; } return; } std::cout recv n bytes: beast::make_printable(buffer_.data()) std::endl; self-do_write(); }); } void do_write() { // 保持文本帧属性原样回写 ws_.text(ws_.got_text()); ws_.async_write(buffer_.data(), [self shared_from_this()](beast::error_code ec, std::size_t) { if (ec) return; // 写完必须消费缓冲区否则下一轮read会读到脏数据 self-buffer_.consume(self-buffer_.size()); self-do_read(); }); } };do_read和do_write之间用buffer_.consume来清空已读数据这是最容易漏的一步。flat_buffer的data()返回的是已读但未消费的内存区域async_write把它送出去之后如果不consume下一轮async_read会把旧数据和新数据混在一起。Demo里do_write结束后调用do_read重新进入监听状态这就是异步读写循环。websocket::error::closed是客户端正常关闭连接时产生的错误码需要单独判断不能当作严重错误打印。服务端main函数int main() { auto const address net::ip::make_address(0.0.0.0); auto const port static_castunsigned short(8080); net::io_context ioc{1}; std::make_sharedlistener(ioc, tcp::endpoint{address, port})-do_accept(); ioc.run(); return 0; }ioc{1}表示io_context内部只使用一个线程执行事件循环。对echo Demo来说单线程足够但如果你要在多核机器上支撑大量并发连接这里要改成ioc{4}或更高同时配合多个run()线程。监听地址用0.0.0.0表示接受所有网卡的连接如果只想本机访问可以改成127.0.0.1。3.2 客户端连接、握手、发送与接收客户端比服务端简单很多没有accept逻辑直接解析地址、连接、握手、收发。#include boost/beast/core.hpp #include boost/beast/websocket.hpp #include boost/asio/connect.hpp #include boost/asio/ip/tcp.hpp #include cstdlib #include iostream namespace beast boost::beast; namespace websocket beast::websocket; namespace net boost::asio; using tcp net::ip::tcp; int main(int argc, char** argv) { auto const host 127.0.0.1; auto const port 8080; net::io_context ioc; tcp::resolver resolver{ioc}; auto results resolver.resolve(host, port); websocket::streamtcp::socket ws{ioc}; auto ep net::connect(ws.next_layer(), results); ws.handshake(host, /); ws.write(net::buffer(std::string(hello from client))); beast::flat_buffer buffer; ws.read(buffer); std::cout beast::make_printable(buffer.data()) std::endl; ws.close(websocket::close_code::normal); return 0; }ws.next_layer()返回的是底层socket对象net::connect在这个socket上做TCP三次握手。handshake(host, /)的第二个参数是HTTP请求路径服务端如果不校验路径传什么都行。ws.write和ws.read是同步阻塞接口这是出于Demo简单性的考虑。生产代码里一般会用async_write和async_read避免一个客户端卡住拖死整个线程。3.3 三个关键参数shared_from_this、flat_buffer、strandshared_from_this是整个异步代码的生命周期基石。async_accept和async_read的回调都是延迟执行的如果session对象在回调触发前被析构就是典型的悬垂指针崩溃。用enable_shared_from_this配合self shared_from_this()构造捕获可以保证异步回调执行期间对象一定存活。这是Beast/Asio异步编程里最常见的坑没有之一。flat_buffer是可增长的连续缓冲区read之后的数据留在里面直到手动consume理解它的生命周期就能避免“回显正常但第二帧数据错位”的玄学问题。4. 编译与运行CMake工程、g直接编译与连通性验证4.1 环境准备Boost版本与CMake最小工程编译这个Demo不需要预先编译Boost库因为Beast是header-only的。只需要保证Boost头文件被编译器找到。我使用的环境是Ubuntu 22.04 Boost 1.74 CMake 3.16这个组合对Beast非常友好。如果你的Boost版本低于1.70代码里websocket::streamtcp::socket还能用但net::make_strand需要改成boost::asio::strand手动构造需要注意版本差异。CMakeLists.txt如下cmake_minimum_required(VERSION 3.10) project(websocket_demo) find_package(Boost REQUIRED) add_executable(server server.cpp) add_executable(client client.cpp) # Beast是header-only库链接Boost::headers即可不需要libboost_system target_link_libraries(server PRIVATE Boost::headers) target_link_libraries(client PRIVATE Boost::headers)这段配置的关键是Boost::headers。很多人在这一步犯糊涂到处找libboost_system.so去链接。实际上Beast用不到Boost的编译产物只需要头文件路径。如果编译时提示找不到Boost头文件用下面的方式指定路径cmake .. -DBOOST_ROOT/path/to/boost_1_74_04.2 三种编译方式CMake、g与IDE导入CMake方式最省心适合作为主力编译方式mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease cmake --build . -j4g直接编译适合快速验证g -stdc17 -O2 -I/usr/include -o server server.cpp g -stdc17 -O2 -I/usr/include -o client client.cpp注意必须加-stdc17Beast和Asio的异步接口依赖C17的某些特性缺了这个编译会报std::invoke_result找不到之类的错误。IDE导入时也同样设置C17标准Qt Creator和VS Code的CMake插件都能直接识别这份CMakeLists。先编译服务端再编译客户端两个可执行文件应该在同一个目录下方便后面的联调。4.3 运行验证先起服务端再起客户端编译完成后先开一个终端运行服务端./server服务端没有任何输出是正常的它在等待连接。再开第二个终端运行客户端./client正常情况下客户端会输出一行hello from client紧接着服务端终端会输出recv 17 bytes: hello from client这里17字节就是hello from client这个字符串的实际长度。能同时看到这两行输出说明TCP连接、WebSocket握手、文本帧收发、回显四个环节全部正常。如果客户端没有任何输出且没有退出大概率是握手没完成此时按CtrlC退出客户端回头检查服务端日志和防火墙。如果客户端报Connection refused说明服务端没起来或端口不对用ss -lnt | grep 8080确认监听状态。4.4 一个容易被忽略的验证关闭连接Demo里客户端主动发送close请求服务端不应报错。观察服务端输出如果出现read error: WebSocket closed这样的日志说明客户端正常关闭了连接这是预期行为而不是故障。我在最初跑这个Demo时看到服务端抛错误码就以为是自己写崩了后来才确认这个错误码就是协议的normal closure提示。5. 编译与运行常见问题排查五条真实踩坑记录5.1 编译报错websocket stream模板参数不匹配现象编译服务端代码时报错提示websocket::stream的模板参数无法推导或者提示tcp_stream相关的类型不完整。原因Boost.Beast在1.70版本把websocket::stream的默认底层流从tcp::socket换成了beast::tcp_stream。新版本里beast::tcp_stream内部持有net::executor并提供了超时控制等能力。旧代码里直接写websocket::streamtcp::socket在新Boost版本下开始报类型不匹配。解决如果你用的是Boost 1.70以上把socket改为websocket::streambeast::tcp_stream并引入boost/beast/ssl.hpp如果走TLS。但要注意Beast对TLS的支持需要同时修改next_layer()的调用方式。最简单稳妥的方案是用Demo里的写法并把Boost版本锁定在1.74左右尽量不跨大版本编译。5.2 链接阶段报一堆Asio符号错误现象编译命令正确但链接时疯狂报undefined reference to boost::system::...或boost::asio::...符号找不到。原因不同发行版的Boost.Async组件打包方式不一致。有的Linux发行版把Asio独立编译成库有的则要求显式链接boost_system。Beast虽然是header-only但Asio的老版本需要链接boost_system才能解析错误分类相关的符号。解决在CMakeLists里追加一行target_link_libraries(server PRIVATE Boost::headers Boost::system) target_link_libraries(client PRIVATE Boost::headers Boost::system)如果使用g直接编译加上-lboost_system。另外可以在源文件最前面加上#define BOOST_ASIO_HEADER_ONLY强制Asio走header-only模式这样就不需要链接任何Boost库了。我个人的习惯是加这个宏省心。5.3 服务端崩溃回调执行时对象已被析构现象一旦有客户端连接服务端随机崩溃错误栈指向async_read回调内部。运行久一点才崩溃或者客户端一连接就崩。原因session对象生命周期管理不当。如果你在do_accept里用session*裸指针创建对象async_accept回调执行时session可能已经离开了作用域并被析构。这种情况是悬垂指针崩溃纯属运气问题有时回调先执行能跑通有时回调后执行直接段错误。解决强制统一用std::make_sharedsession(...)加上shared_from_this()捕获。对shared_ptr的引用会一直存活到所有异步操作结束。注意不要在run()和do_read()里捕获this应始终捕获self shared_from_this()。5.4 服务端重启时报Address already in use现象服务端被CtrlC杀掉后立刻重启报bind: Address already in use等几十秒又恢复正常。原因TCP连接关闭后进入TIME_WAIT状态通常是服务端主动关闭连接或进程被强杀导致。没有设置SO_REUSEADDR时内核在短时间内不允许重新绑定该端口。解决在listener构造里加上acceptor_.set_option(net::socket_base::reuse_address(true))这个选项在程序退出后立刻重启时非常关键。上述代码里已经包含这一行如果你是自己手动写服务端务必记得。5.5 接收到中文乱码或长度不对现象发送英文正常发送中文字符串时长度明显不对或者回显内容乱码。原因客户端发送的帧里中文在UTF-8编码下每个字符占3字节而有些代码里误用了std::string::size()和strlen混用甚至用char数组手动计算长度导致截断或超发。Beast的async_write的net::buffer依赖正确的大小信息。解决统一用std::string保存消息传给net::buffer时它内部自动处理长度不要自己数长度。beast::make_printable打印时按字节流输出也能正确显示UTF-8内容。如果回显数据和原数据不一致检查是否在发送前对字符串做了多余的空格截断。6. 进阶用法从echo到能扛住真实请求的连接保活Demo跑通之后下一步通常是加心跳保活。WebSocket在TCP层空闲久了会被中间网关断开但应用层感知不到。Beast提供的心跳机制是发送ping帧服务端和客户端约定每30秒互发一次。用asio::steady_timer定时触发在回调里调用ws_.async_ping收到pong帧后继续排下一次定时器。另一种常见需求是TLS加密。把websocket::streamtcp::socket替换成websocket::streambeast::ssl_streambeast::tcp_stream并让客户端使用wss://协议。这个改动涉及握手回调里先做SSL握手再走WebSocket握手且需要加载证书。对测试环境可以先用自签证书生产环境再换正规证书。我一般会在Demo跑通后先加TLS再并发压测顺序不要颠倒否则问题混在一起很难排查。并发验证也很简单写一个循环脚本连续启动多个客户端for i in $(seq 1 20); do ./client done wait如果20个客户端同时在跑且服务端没有崩溃或大量丢包说明服务端的异步模型基本靠谱。之后再把ioc{1}改成ioc{4}用多线程跑io_context.run()观察CPU占用和内存增长情况。正常情况内存稳定无泄漏CPU在多核下会分散到多个线程。回到最初那句话这份Demo值不值得下载取决于你是否需要在一个小时内摸清C WebSocket的最小实现。对我来说它最大的价值是给了我一个能反复对照的基线版本。从那以后每次搭WebSocket服务我都强制要求自己先把echo闭环跑通再加心跳、TLS、多线程每一步改动都单独验证一遍。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

SSM整合项目实战:从图书模块看企业级Java工程化思维

SSM整合项目实战:从图书模块看企业级Java工程化思维

1. 从零开始理解“SSM整合项目”在实习场景中的真实定位很多人看到“中软国际暑期实习day06”这个标题,第一反应是:又一个模板化的企业培训流水账?但如果你真在某家大型IT服务公司带过实习生,或者自己就是从这类实习走出来的开发者…

2026/10/15 17:06:12 阅读更多 →
PMSM矢量控制Simulink建模:从FOC原理到可调试数字孪生

PMSM矢量控制Simulink建模:从FOC原理到可调试数字孪生

简介:本资源是一套面向电气工程、自动化及电机控制方向初学者与进阶学习者的PMSM变频调速控制系统Simulink建模仿真学习资料,聚焦永磁同步电机核心控制原理与工程实现。资源共15个文件,含14个.mdl模型文件(覆盖SVPWM、SPWM、FOC矢…

2026/10/15 17:05:11 阅读更多 →
HTML5调用摄像头黑屏原因与稳定显示方案

HTML5调用摄像头黑屏原因与稳定显示方案

1. 这不是“放个video标签”就能搞定的事很多人第一次想在网页里调用摄像头&#xff0c;第一反应就是翻文档找<video>标签&#xff0c;加个autoplay和muted&#xff0c;再塞进srcObject——结果页面一片黑&#xff0c;控制台安静得像没写过代码。我见过太多人卡在这一步&…

2026/10/15 17:05:11 阅读更多 →

最新新闻

VLC 3.0.11 定制版支持 AVS+ 与 DRA 软解实战指南

VLC 3.0.11 定制版支持 AVS+ 与 DRA 软解实战指南

简介&#xff1a;本资源为适配Windows 7及以上系统的VLC媒体播放器3.0.11定制增强版&#xff0c;专为需播放国产音视频编码内容的开发者、广电从业人员及高清影音爱好者设计&#xff0c;解决主流播放器对AVS和DRA格式兼容性不足的问题。压缩包为7z格式&#xff0c;大小130.6MB&…

2026/10/15 17:48:03 阅读更多 →
Android属性动画解析:从补间动画缺陷到ObjectAnimator实战与原理

Android属性动画解析:从补间动画缺陷到ObjectAnimator实战与原理

做Android开发这些年&#xff0c;我最早接触的是补间动画&#xff0c;一个AnimationSet往上一套&#xff0c;平移、旋转、透明度都有现成接口&#xff0c;看起来挺方便。但真正在复杂交互里遇到按钮“飞过去但点不到”的问题之后&#xff0c;我才重新理解了属性动画的价值。而O…

2026/10/15 17:48:03 阅读更多 →
2026 最新 Codex 新手教程:用 cc-switch + TaoToken 零基础跑通 AI 编程

2026 最新 Codex 新手教程:用 cc-switch + TaoToken 零基础跑通 AI 编程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 17:48:03 阅读更多 →
CAN总线协议详解:从物理层差分信号到采样点配置与工程实践

CAN总线协议详解:从物理层差分信号到采样点配置与工程实践

1. 内容整体设计与思路拆解CAN&#xff0c;全称Controller Area Network&#xff0c;控制器局域网络。做嵌入式或者汽车电子的人&#xff0c;对这三个字母再熟悉不过。不管是车身控制、电池管理、电机驱动&#xff0c;还是一些工业自动化设备&#xff0c;几乎所有需要多个节点可…

2026/10/15 17:48:03 阅读更多 →
预编译libssh2类库接入CMake工程:链接配置与避坑指南

预编译libssh2类库接入CMake工程:链接配置与避坑指南

简介&#xff1a;这份资源是面向C/C开发者的libssh2预编译类库及配套头文件包&#xff0c;适合需要为网络管理工具、自动化脚本或远程控制软件集成SSH2能力的开发者使用&#xff0c;可省去自行编译的繁琐过程。压缩包共9个文件&#xff0c;约1.38MB&#xff0c;包含4个h头文件、…

2026/10/15 17:48:03 阅读更多 →
51单片机数码管动态显示与中断系统实战:从原理到代码

51单片机数码管动态显示与中断系统实战:从原理到代码

很多人学51单片机&#xff0c;一开始点个LED觉得挺简单&#xff0c;一到数码管动态显示就开始懵了。不是显示错位就是亮度不均&#xff0c;再往后遇到中断更是云里雾里。我当年自学的时候也在这个节点卡了差不多两周&#xff0c;后来把原理彻底理清楚才发现&#xff0c;数码管动…

2026/10/15 17:47:03 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时&#xff0c;网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上&#xff0c;依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里&#xff0c;扩缩容到底难在哪做过大模型推理服务部署的人&#xff0c;大概都经历过这样的场景&#xff1a;一个团队共用一套推理集群&#xff0c;A 业务跑的是 7B 的小模型&#xff0c;B 业务跑的是 72B 的大模型&#xff0c;C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子&#xff1a;一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减&#xff0c;为了把启动时间压进两秒以内&#xff0c;我手贱地把一串自认为“没用”的 systemd 服务给 disable 了&#xff0c;其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →