Linux下UDP接口测试与多人聊天Demo完整实践
在 Linux 下做网络编程我猜很多人第一个接触的都是 TCP连接可靠、代码套路固定、出问题也好排查。但要说真正把网络层的脾气摸清楚UDP 接口测试是绕不开的一关。前几天我把“UDP 接口测试 多人聊天 demo”完整做了一遍从最基础的 socket 骨架到好几个客户端同时在线聊天整体比搞 TCP 顺畅不少但坑也踩了一堆。这篇文章就把我当时的方案、代码、测试过程和排查思路完整整理出来给想快速上手 UDP 编程或者需要实现一个最小 UDP 转发服务的人一份可以直接抄作业的参考。这个项目拆开看就两件事第一把 UDP 通信涉及的核心接口逐一验证确认行为符合预期第二用多人聊天这个场景把这些接口串起来证明它们组合在一起能承担真实任务。整条链路覆盖了 socket 创建、地址绑定、数据报收发、客户端管理、消息广播和并发测试基本把 UDP 服务的常见形态都过了一遍。适合刚接触 Linux socket 编程的读者也适合要做日志上报、在线状态通知这类轻量转发服务的开发者直接复改。1. 为什么选 UDP 来测接口和做聊天 Demo1.1 需求拆解接口测试和多人聊天分别要什么仔细拆一下这个项目其实是两个需求叠在一起。第一个需求是“UDP 接口测试”。这里说的接口不是 HTTP 接口而是系统调用层的接口包括socket、bind、sendto、recvfrom、select、setsockopt这些函数。测试的目标是确认它们在目标机器上的行为符合预期参数怎么取值、返回值代表什么、错误码什么情况下出现、多线程下是否稳定。所以这一步不应该一上来就写大而全的应用而是先搭一个最小骨架再逐步加条件验证。第二个需求是“多人聊天 demo”。作为验证 UDP 接口的载体多人聊天有个非常好的性质消息边界天然清晰每个数据报正好对应一条消息服务器做转发时不用拆包、拼包、处理粘包能把注意力集中在网络接口本身。聊天 demo 和接口测试放在一起最终结果既能看到接口是否正常又能直观感受到多客户端同时在线时的实时通信效果。我最后选用的方案很朴素客户端-服务器模式所有客户端把消息发给服务器服务器再把消息广播给其他在线客户端。没有用开源聊天框架没有引入消息队列中间件甚至没有设计复杂应用层协议纯粹靠原生 socket API。原因很简单测试阶段最重要的就是透明协议越简单问题越容易定位。1.2 对比 TCP 之后为什么选 UDP先放一张对比表把 UDP 和 TCP 在这个场景下的差异说清楚维度TCPUDP连接管理三次握手建立连接断开要四次挥手无连接sendto 就能发消息边界字节流需要应用自定义分包和处理粘包数据报一次 recvfrom 正好收一条消息可靠性有序、可靠、丢包重传不可靠可能丢包、乱序服务端实现每连接一个 fd需要事件循环或线程池单一 fdrecvfrom 一次就能拿到源地址在线管理连接断开可以感知没有连接概念要靠应用层心跳对照下来多人聊天场景里单条消息只有几百字节丢一条不至于造成事故顶多让对方喊你重发一次加上 UDP 的“无连接 单 fd 天然消息边界”三个特性服务器实现成本低非常多。反过来如果这个 demo 要做文件传输、在线交易那肯定不能用 UDP可靠性和流量控制都得自己补工程量反而比 TCP 大。有人可能会问为什么不用 UDP 广播或者组播来实现多人聊天我当时的考虑是广播只能局限在同一网段跨网段路由器不转发组播在家庭路由和部分云主机网络里限制很多。用服务器转发虽然在局域网内多一次拷贝但能稳定覆盖跨网段场景也更贴近大多数线上 UDP 服务的设计模型。所以最终选了客户端-服务器这种看起来“土”但足够稳的方案。2. UDP 接口层的基础与最小骨架2.1 先跑通最小 socket 骨架正式开始前我在一台干净的 Linux 机器上准备好环境gcc 编译器、基础头文件就够。UDP socket 最小骨架只有几行代码#include stdio.h #include stdlib.h #include unistd.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h int main(void) { int sockfd socket(AF_INET, SOCK_DGRAM, 0); if (sockfd 0) { perror(socket); exit(1); } close(sockfd); return 0; }第一个参数AF_INET指定 IPv4第二个参数SOCK_DGRAM表示数据报套接字第三个协议参数传 0让系统自动选择 UDP 协议。TCP 用的是SOCK_STREAM这是两者在 socket 层面最直观的区别。编译命令也很简单gcc -o udp_min udp_min.c -Wall创建出来的 fd 不 bind 也能直接sendto但那种状态通常只能发包不能收包适合做纯客户端。如果一个进程要接收消息就必须先 bind 到某个端口。bind 失败最常见的原因两个一个是端口被占用报Address already in use另一个是权限不足绑定 1024 以下端口需要 root 权限。2.2 bind、sendto、recvfrom 三个核心函数bind 的代码模式几乎是固定的struct sockaddr_in addr; memset(addr, 0, sizeof(addr)); addr.sin_family AF_INET; addr.sin_addr.s_addr htonl(INADDR_ANY); addr.sin_port htons(8888); if (bind(sockfd, (struct sockaddr *)addr, sizeof(addr)) 0) { perror(bind); exit(1); }这里有两个点新手最容易踩s_addr用htonl(INADDR_ANY)表示绑定所有网卡地址适合服务器sin_port必须先htons转成网络字节序。直接写 8888实际绑定的端口会是另一个数排查起来非常迷惑。sendto 和 recvfrom 的函数签名ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);注意recvfrom 的最后一个参数是socklen_t *调用前必须初始化socklen_t addrlen sizeof(src_addr);我最早写的时候就是漏了这行初始化结果客户端地址解析出来一直是0.0.0.0花了大半天才发现问题只在参数没初始化不是网络问题。这个坑在后面第 5 节还会再次遇到可以说是 UDP 编程最容易自坑的地方。UDP 一个隐藏行为是“数据报边界”发送端每次sendto产出一个数据报接收端一次recvfrom只能取一个数据报如果缓冲区小于数据报长度多余部分会被直接丢弃不会像 TCP 那样留在缓冲区里下次再读。所以我做聊天 demo 时把缓冲区定成 2048一条普通聊天消息远小于此值够用又不会踩截断的坑。2.3 端口复用和接收超时接口测试阶段一个很现实的问题是服务器会频繁重启。UDP 虽然没有 TCP 那么多连接状态但如果旧进程还占着端口再次 bind 依然会失败。解决方法是在创建 socket 之后立刻加一行int opt 1; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, opt, sizeof(opt));这行代码在测试期间几乎是必须的。我调试时经常改代码、杀进程、重新启动没加它之前基本每两次就要换个端口或者等一等加了之后从容很多。如果不想让recvfrom无限期阻塞可以用setsockopt的SO_RCVTIMEO设置接收超时也可以用select做事件等待。单线程带超时用前者简单但多客户端同时在线时我更推荐select因为 select 是在“fd 是否可读”这个层面等待不会因为某个数据包的阻塞影响其他客户端的处理。这个特性在后面并发测试和聊天服务器里都会用到。3. 接口测试实操从回显到并发3.1 第一轮最小回显服务验证主链路第一轮测试我写了个最小回显服务逻辑是“你发什么我原样发回什么”。这一轮把bind recvfrom sendto这条主链路完整跑通。while (1) { struct sockaddr_in client_addr; socklen_t addrlen sizeof(client_addr); char buf[2048]; int n recvfrom(sockfd, buf, sizeof(buf) - 1, 0, (struct sockaddr *)client_addr, addrlen); if (n 0) { perror(recvfrom); continue; } buf[n] \0; printf(recv %s:%d - %s\n, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buf); sendto(sockfd, buf, n, 0, (struct sockaddr *)client_addr, addrlen); }两个细节值得留意recvfrom的缓冲区长度减 1是为了给字符串结束符留位置sendto的长度用n也就是原样发回实际收到的字节数不要用strlen(buf)否则在消息里包含\0或二进制内容时长度会不一致。测试客户端我用系统自带的 ncecho hello udp | nc -u 127.0.0.1 8888看到服务器打印出源地址、源端口和消息内容同时客户端收到回显hello udp第一轮就算通过。不过 nc 只能测单包后续的多人场景就不够用了。3.2 第二轮用 select 处理多客户端并发进入第二轮把服务器改成select加recvfrom的写法。select 的作用是监听 fd 的可读事件替代直接阻塞在 recvfrom 上。fd_set readfds; FD_ZERO(readfds); FD_SET(sockfd, readfds); int ret select(sockfd 1, readfds, NULL, NULL, NULL); if (ret 0 FD_ISSET(sockfd, readfds)) { // 走到这里的 recvfrom 一定不会阻塞 }select 第一个参数要传“最大 fd 值 1”这是个很细但是关键的规则。写小了在某些内核版本下会静默丢失事件排查起来很坑。这一轮我同时起了 5 个客户端轮流发消息每个包都能被服务器正常收到并回显没有丢包和错包。UDP 不像 TCP 那样有连接队列服务器只要 bind 了端口所有客户端都能平等地把数据报到同一个 fd 上这是 UDP 多客户端并发的关键也是后面聊天 demo 能成立的基础。3.3 第三轮接口行为确认清单三轮测试跑完我给自己列了一张验收清单当作接口测试的结论bind绑定 INADDR_ANY端口不可重复绑定开启 SO_REUSEADDR 后重启无压力sendto无需 connect 就能向任意地址发包返回值是实际发送字节数recvfrom每次取一个数据报源地址和源端口可以准确拿到select监听 fd 可读状态单线程处理多客户端收发足够UDP 数据报边界严格一次发送对应一次接收不需要处理粘包。到这里接口测试部分完成接下来就是把测试代码扩展成多人聊天 demo。4. 多人聊天 Demo 完整实现4.1 服务器端设计客户端表加广播转发服务器端的核心逻辑很清晰维护一张在线客户端表收到任意一条消息后把消息转发给表中除了发送者之外的所有客户端。为什么选择排除发送者因为发送者本地已经知道自己发了什么如果服务器再回传一遍客户端就会在终端看到自己消息的重复打印观感很差。部分聊天软件会回传并自行去重各有理由但 demo 里做排除逻辑最简单直观。客户端表用结构体数组实现#define MAX_CLIENTS 64 #define BUFFER_SIZE 2048 typedef struct { struct sockaddr_in addr; int active; } Client; static Client clients[MAX_CLIENTS];收到消息后的处理流程是先从表里找相同 IP 和端口的客户端找到就复用表项没找到就找第一个 inactive 的空闲位置插入。表满时打印提示并丢弃新客户端消息。用active字段做空闲标记非常轻量避免了频繁分配释放内存在 64 并发以内完全够用。服务器主要转发逻辑static void broadcast(int sockfd, const char *msg, size_t len, const struct sockaddr_in *exclude) { for (int i 0; i MAX_CLIENTS; i) { if (!clients[i].active) continue; if (exclude clients[i].addr.sin_port exclude-sin_port clients[i].addr.sin_addr.s_addr exclude-sin_addr.s_addr) { continue; } sendto(sockfd, msg, len, 0, (struct sockaddr *)clients[i].addr, sizeof(clients[i].addr)); } }main 循环就是 select 等待读事件、recvfrom 收数据、登记客户端、构造带发送者信息的消息、调 broadcast 广播。整段代码去掉注释不到 100 行。对接口测试来说这种设计的好处是所有网络行为都集中在几行系统调用上哪一步出错perror 看报错就能快速锁定是 bind、recvfrom 还是 sendto 的问题。4.2 聊天客户端收和发分离客户端要同时干两件事从键盘读输入并发送接收服务器广播并显示。最直接的做法是用两个线程一个管收一个管发。接收线程代码void *recv_thread(void *arg) { char buf[BUFFER_SIZE]; while (1) { struct sockaddr_in from; socklen_t fromlen sizeof(from); int n recvfrom(sockfd, buf, sizeof(buf) - 1, 0, (struct sockaddr *)from, fromlen); if (n 0) { buf[n] \0; printf(\r%s\n , buf); fflush(stdout); } } return NULL; }主线程则是循环fgets读键盘去掉换行符后 sendto。打印消息前先输出\r回车覆盖当前正在输入的内容避免收到的消息把输入行截断。这个小细节能明显提升实际使用体验。如果不想用线程客户端可以改成select同时监听 stdin 和 sockfd逻辑差不多但要处理两个 fd 的读写状态。线程方案在主逻辑上更直观所以 demo 用了 pthread。4.3 Demo 运行实录与结果编译服务器和客户端gcc -o chat_server chat_server.c -Wall gcc -o chat_client chat_client.c -Wall -pthread启动服务器再开两个终端分别运行客户端./chat_server ./chat_client 127.0.0.1 ./chat_client 127.0.0.1客户端 A 输入hello everyone服务器控制台打印一行[127.0.0.1:54321] hello everyone客户端 B 的终端上会显示[127.0.0.1:54321] hello everyoneB 回一条hi AA 也能立刻看到[127.0.0.1:55555] hi A。整个过程没有人为加延迟select 多路复用下 CPU 占用几乎为零局域网内消息是实时送达的。我还把三个客户端加一个服务器全部跑在同一台机器上模拟多人场景也没有出现线程冲突只有客户端同时进入退出时偶尔打印顺序错位不影响功能。有一点需要特别注意UDP 客户端没有“断线”概念直接关闭客户端进程后服务器不会收到任何通知客户端表里依然遗留旧地址。这个问题会在第 5 节展开因为它是 UDP 聊天场景最容易忽略的隐藏坑。5. 常见问题与排查技巧实录5.1 高频异常速查表把这次测试期间遇到的典型问题整理成一张表现象可能原因解决方案bind 报 Address already in use端口被占用加 SO_REUSEADDR或换端口客户端收不到回包服务器地址/端口写错addrlen 未初始化检查 server_addr初始化 addrlen发消息后服务器没反应防火墙拦了 UDP 端口临时放行对应端口确认防火墙规则消息显示乱码或截断缓冲区太小数据报被丢弃增大缓冲区按 MTU 控制单条消息长度多客户端之间看不到彼此广播时排除发送者的条件写反核对 broadcast 循环中的 continue 条件客户端关闭后仍在服务器列表UDP 无连接服务端无法感知退出增加心跳超时机制“客户端收不到回包”这个问题我在 2.2 小节提到过addrlen 没初始化导致的地址不对是最典型的自坑。表格里再强调一次因为它实在太隐蔽了。5.2 调试工具组合拳当消息确实发出去了但找不到问题的时候别只盯着代码看上抓包工具。我常用的组合是ss、nc和tcpdumpss -uap | grep 8888看端口监听状态和关联进程nc -u 127.0.0.1 8888模拟客户端发一条消息tcpdump -i lo udp port 8888 -XX在回环接口上抓包确认数据报的四元组和内容。有一次测试时客户端明明显示发送成功服务器也打印了源 IP但其他客户端就是收不到。我抓包一看消息其实已经发到了其他客户端本机但回环接口的数据报显示目标端口不是固定端口而是某个随机高位端口原因就是我在客户端recvfrom时把 addrlen 传错把地址结构改写了。抓包数据直接定位到问题在地址长度参数而不是广播逻辑。这种问题靠肉眼读代码非常难发现抓包一开就清楚了。tcpdump 输出大致是这样的IP 127.0.0.1.12345 127.0.0.1.8888 UDP, length 11看到源地址、目标地址和 length 都正常才敢确认网络层没问题再回头查应用层。6. 实操心得与后续扩展6.1 综合实操心得做完这个 demo我最大的感受是UDP 接口看起来简单工程细节一点不比 TCP 少。接口测试阶段一定要分层验证不要一上来就把服务器、客户端、广播全部写完再调试。我先跑回显再跑并发最后才加业务逻辑每一步出问题都能把范围缩得很小定位速度非常快。另一个心得是所有与网络字节序相关的字段都要打出来看。调试日志里同时输出ntohs(client_addr.sin_port)和inet_ntoa(client_addr.sin_addr)能第一时间发现地址解析异常。我见过太多人打印整形端口号数字莫名其妙最后发现只是忘了字节序转换。6.2 心跳与离线检测第 4 节遗留的“客户端退出后表里残留旧地址”问题正规解法是加心跳机制。思路不复杂每个客户端每隔 5 秒向服务器发一条特殊标记的心跳消息服务器在收到消息时维护一个last_seen时间服务器再另起一个周期扫描逻辑把超过 10 秒没心跳的客户端标记为 inactive。实现上只需要在 Client 结构体里加一个time_t last_seen字段再补一段扫描代码几十行就搞定。很多人觉得聊天 demo 不需要管离线但一旦往生产方向走客户端表无限增长、僵尸客户端占满表项就是 UDP 服务最常见的问题。至少在数据结构上把扩展位留好后续加心跳不会伤筋动骨。6.3 扩展方向如果要让这个 demo 继续生长我大概会沿这几个方向走把单服务器改成多节点转发用一致性哈希分配聊天室在消息前缀里加入聊天室 ID实现多房间隔离增加 AES 或 RSA 加密保证消息不会被中间人直接读取把 select 改成 epoll支持上万级并发客户端。改造成 epoll 时有个 UDP 和 TCP 的差异要注意UDP 下 epoll 只关心 EPOLLIN 和 EPOLLERR 事件不需要监听 EPOLLOUT每次 epoll_wait 返回后仍然要用 recvfrom 去读而不是像 TCP 那样把 fd 交给业务层长期持有。这部分改动不大但理解模型差异很重要。最后补一句个人体会如果让我重做一次我还会在阶段二就把心跳加上。很多坑在 demo 阶段不出现等接入真实用户后一个个冒出来与其那时候补不如从一开始就按生产标准搭地基。UDP 接口就这么几个真正值钱的是把这些接口组合成可靠服务时的那层业务逻辑这才是这次做完之后最实际的收获。

相关新闻

批量删除QQ空间说说脚本实战:Cookie、g_tk与接口调用解析

批量删除QQ空间说说脚本实战:Cookie、g_tk与接口调用解析

简介:2023年最新版QQ空间说说批量删除插件,专为QQ空间重度用户及需要一次性清理历史说说的人群打造,适用于新版QQ空间界面,解决逐条手动删除效率低下、难以批量管理的问题。资源共3个文件,核心为JavaScript自动删除脚本…

2026/10/13 15:24:02 阅读更多 →
代码覆盖率统计工具落地实践:从原理到质量门禁配置

代码覆盖率统计工具落地实践:从原理到质量门禁配置

前阵子团队做质量复盘,技术负责人抛出一句话:功能测了这么多,到底有多少代码被真正运行过?大家都愣住,因为当时没人能回答这个问题。后来我花了小半个月,把代码覆盖率统计工具从零搭了起来,覆盖…

2026/10/13 15:24:02 阅读更多 →
Scikit-learn模型评估实战指南:数据划分、指标选择与交叉验证

Scikit-learn模型评估实战指南:数据划分、指标选择与交叉验证

1. 为什么要认真对待模型评估这件事我见过太多人花大量时间调模型,最后却在评估环节草草了事:训练集上准确率刷到98%就觉得自己大功告成,扔上线才发现真实场景里完全不是那么回事。这里面的差别,恰恰就是“会训练模型”和“会做机…

2026/10/13 15:24:02 阅读更多 →

最新新闻

2026年软件测试面试高频考点与质量保障实战指南

2026年软件测试面试高频考点与质量保障实战指南

最近大半年,我断断续续面了几十个测试候选人,最大的感受是:2026年的软件测试面试题,已经不太看你简历里列了多少工具,大家聊的范围也从“你怎么定位元素”拉到了“你的测试方案能不能扛住一条完整业务链路”。这不是坏…

2026/10/13 16:15:25 阅读更多 →
Unity扇形Slider实现原理与工程化实践

Unity扇形Slider实现原理与工程化实践

1. 项目概述:为什么一个扇形Slider比矩形进度条更值得深挖在Unity项目里做UI进度反馈,很多人第一反应就是拖个RectMask2DImageFillAmount完事——简单、快、引擎原生支持。但真正在做游戏引导、技能冷却、能量充能、医疗设备模拟这类需要强视觉暗示的场景…

2026/10/13 16:15:25 阅读更多 →
移动端长列表返回原位置:虚拟列表场景下的滚动恢复方案

移动端长列表返回原位置:虚拟列表场景下的滚动恢复方案

先讲一个发生在我自己项目上的真实需求:移动端商城首页,商品列表滚了三屏,用户滑到第五屏,点了一个商品进详情,返回后首页直接从顶部重新开始。用户当场就懵了,他得重新回忆刚才在看哪一档价格、对比到哪个…

2026/10/13 16:15:25 阅读更多 →
PyTorch GPU加速实战:MNIST CNN训练全流程优化

PyTorch GPU加速实战:MNIST CNN训练全流程优化

1. 项目概述:为什么一个“MNISTGPUPyTorch CNN”仍值得深挖你点开这个标题,大概率不是为了第一次听说MNIST——它被称作计算机视觉的“Hello World”,但恰恰是这个看似简单的手写数字分类任务,成了检验深度学习工程能力最扎实的试…

2026/10/13 16:15:25 阅读更多 →
移动端战术射击游戏开发的核心挑战与实战优化

移动端战术射击游戏开发的核心挑战与实战优化

1. 为什么“三角洲行动”这类战术射击手游的移动端开发,根本不是把PC端逻辑简单移植过去?“三角洲行动”这个标题一出来,很多刚接触移动游戏开发的朋友第一反应是:不就是把《使命召唤》或者《彩虹六号》的玩法搬到手机上&#xff…

2026/10/13 16:15:25 阅读更多 →
国外文献检索实战:从平台选择到引文追踪的完整方法论

国外文献检索实战:从平台选择到引文追踪的完整方法论

拿到一个新课题,第一件事往往不是急着读文献,而是要回答一个更基础的问题:国外研究文献到底去哪儿找。这些年我被同门、学弟妹、合作项目的伙伴反复问过这个问题,问的人从刚进组的学生到准备开题的研究生都有。大家普遍以为答案是…

2026/10/13 16:14:22 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →