Python实现高可靠TCP文件传输服务器
简介本资源是一个基于TCP协议实现的文件传输服务器完整工程面向网络编程初学者与C/Windows桌面开发学习者解决客户端与服务器间可靠、有序文件传输的核心问题适用于课程设计、网络通信实验及底层Socket编程实践。压缩包共42个文件包含3个核心源码文件cpp/h、1个可执行程序exe、1个Visual Studio解决方案sln及多个编译中间产物obj、pdb、tlog等体现VS2015环境下典型的MFC对话框项目结构与构建流程整体包体大小为67.33MB。已有1520人学习下载。读者可直接编译运行FileServer.exe通过预览目录可见其采用标准VCXPROJ工程组织含资源文件rc/ico、头文件依赖管理filters、调试符号pdb及增量编译缓存ipch便于理解Windows平台TCP服务端从连接建立、元数据协商文件名/大小、流式接收、磁盘写入到连接关闭的全链路实现细节。1. TCP文件传输服务器不是写个socket.send()就完事它得扛住断网重传、大文件卡顿、并发百连接不崩你手头有个嵌入式设备要升级固件或者某实验室需要把一批采集的传感器原始数据从边缘节点回传到中心服务器——这时候“TCP文件传输服务器”不是教科书里那个三行代码建连接、sendfile()一发了之的玩具。真实场景里它得在Wi-Fi信号忽强忽弱的车间里稳稳收完80MB的.bin包得让12台工控机同时上传日志时不互相抢光带宽得在客户端突然拔网线后30秒内自动续传而不是丢掉前29MB。这不是网络编程入门题是IO调度、缓冲控制、状态机设计和异常耐受的组合拳。本文面向已写过基础socket但被生产环境打脸过的开发者不讲三次握手原理只拆解一个能放进Docker、跑满千兆网卡、日志可查、重启不丢任务的轻量级TCP文件传输服务怎么一步步落地。所有代码基于Python 3.9标准库零第三方依赖适配Linux/Windows双平台重点落在“为什么这么设参数”和“哪一行不加注释就会翻车”。2. 从阻塞socket到非阻塞IO为什么单线程select模型比多线程更稳2.1 为什么不用threading看这3个血泪现场某跨平台系统早期用threading.Thread为每个客户端启一个线程处理文件接收。上线第三天凌晨监控报警内存暴涨至95%ps aux | grep python显示217个线程在sleep。排查发现客户端上传中途断开比如手机切4G线程卡在conn.recv(8192)上Python默认阻塞模式下这个recv会永远等下去——直到操作系统超时Linux默认约30分钟而217个线程各自占着几MB栈空间直接OOM。提示TCP连接断开 ≠ recv立刻返回。对端静默关闭如kill -9进程、网络中断、NAT超时都会让recv陷入无限等待。settimeout()能救急但无法解决高并发下的资源碎片化问题。另一个翻车点多个线程同时写同一个文件。A线程刚f.write(data[:1024])B线程紧接着f.write(data[1024:2048])结果文件内容错乱。加锁锁粒度太粗整个文件导致吞吐暴跌锁太细按块又引入复杂的状态同步逻辑。第三个坑是CPU空转。用while True: conn.recv(1)轮询看似简单实则把单核CPU吃满其他业务线程饿死。这不是“能跑”是“在烧钱”。2.2 select模型用单线程轮询所有socket把控制权拿回来核心思路不给每个连接分配线程而是让主线程统一管理所有活跃socket。通过select.select()一次询问“哪些socket有数据可读/可写/出错了”只处理就绪的其余挂起。这样一个线程就能扛住数百连接且无锁、无竞态、无空转。# server_select.py最小可运行select服务骨架 import socket import select import os import time # 创建监听socket server_sock socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_sock.bind((0.0.0.0, 8888)) server_sock.listen(5) server_sock.setblocking(False) # 关键必须设为非阻塞 # 初始化socket列表 read_sockets [server_sock] write_sockets [] message_queues {} # {sock: deque([bdata1, bdata2])} upload_files {} # {sock: {file: open(), offset: 0}} print(TCP文件传输服务器启动监听 0.0.0.0:8888) while True: # 阻塞等待事件超时1秒防CPU空转 readable, writable, exceptional select.select( read_sockets, write_sockets, read_sockets, 1.0 ) # 处理可读socket for sock in readable: if sock is server_sock: # 新连接接入 conn, addr server_sock.accept() conn.setblocking(False) read_sockets.append(conn) message_queues[conn] [] upload_files[conn] {file: None, offset: 0} print(f[新连接] {addr}) else: # 已有连接有数据到达 try: data sock.recv(8192) if data: # 解析协议头见2.3节 handle_client_data(sock, data, upload_files, message_queues) else: # 对端关闭连接 print(f[断开] {sock.getpeername()}) cleanup_socket(sock, read_sockets, write_sockets, message_queues, upload_files) except ConnectionResetError: print(f[强制断开] {sock.getpeername()}) cleanup_socket(sock, read_sockets, write_sockets, message_queues, upload_files) except BlockingIOError: # 非阻塞recv无数据跳过 pass # 处理可写socket发送响应或ACK for sock in writable: try: if message_queues[sock]: next_msg message_queues[sock].pop(0) sent sock.send(next_msg) if sent len(next_msg): # 未发完把剩余部分放回队首 message_queues[sock].insert(0, next_msg[sent:]) except (ConnectionResetError, BrokenPipeError): cleanup_socket(sock, read_sockets, write_sockets, message_queues, upload_files) # 处理异常socket for sock in exceptional: cleanup_socket(sock, read_sockets, write_sockets, message_queues, upload_files)关键参数说明server_sock.setblocking(False)必须设为非阻塞否则accept()和recv()在无事件时会阻塞整个select循环select.select(..., 1.0)超时设为1秒避免空转耗CPU也给其他逻辑如心跳检测留出执行时间message_queues每个socket独立的消息队列解决send()可能只发部分数据的问题——这是TCP流式传输的底层特性不是bugupload_files记录每个连接当前打开的文件句柄和已写入偏移量支撑断点续传。这段代码不是最终版但它划清了底线没有线程爆炸、没有recv卡死、没有文件写冲突。下一步就是让这个骨架真正“懂文件”。3. 协议设计与文件分块为什么固定16字节头比JSON更抗干扰3.1 不要传裸文件协议头是续传和校验的唯一锚点很多初学者直接conn.send(file_bytes)结果遇到两个致命问题客户端不知道文件名和大小服务端收到一堆二进制存成什么名字存到哪断网后无法续传客户端重连从头再发80MB固件传到79MB断了重传成本太高。解决方案定义一个精简二进制协议头16字节定长结构如下字段长度含义示例Magic Number4字节标识协议防乱码bFILEFile Size8字节文件总大小大端int.to_bytes(1048576, 8, big)Filename Len2字节文件名UTF-8长度len(firmware_v2.bin.encode())16Reserved2字节预留扩展位b\x00\x00为什么不用JSON/ProtobufJSON文本解析慢且{size:1048576,name:a.bin}至少25字节还可能含\0导致C端解析失败Protobuf需预编译schema增加部署复杂度16字节头用struct.unpack(!4sQ2s2s, header)毫秒级解析无依赖跨语言友好C/C/Go直接memcpy。3.2 分块传输与偏移校验每块带序号服务端严格校验客户端不能一股脑把整个文件塞进send()。原因有二TCP底层MSS最大分段通常1460字节大块数据会被IP层分片丢一片整块重传服务端内存有限80MB文件全读进内存再写盘OOM预警。正确做法客户端分块建议8KB每块带块序号和校验和。服务端收到后检查块序号是否连续防乱序用CRC32校验块数据防传输损坏seek(offset)写入文件对应位置offset block_size。# client_chunked.py客户端分块上传核心逻辑 import struct import zlib def send_file_chunks(conn, filepath, chunk_size8192): filename os.path.basename(filepath) file_size os.path.getsize(filepath) # 发送16字节协议头 header struct.pack( !4sQ2s2s, bFILE, file_size, len(filename.encode()).to_bytes(2, big), b\x00\x00 ) conn.sendall(header) conn.sendall(filename.encode()) # 分块发送 with open(filepath, rb) as f: offset 0 chunk_id 0 while offset file_size: chunk f.read(chunk_size) if not chunk: break # 构造块头4字节ID 4字节CRC32 块数据 chunk_header struct.pack(!II, chunk_id, zlib.crc32(chunk)) conn.sendall(chunk_header chunk) offset len(chunk) chunk_id 1 print(f已发送块 {chunk_id}, 偏移 {offset}/{file_size}) # 服务端解析块接2.2节handle_client_data函数 def handle_client_data(sock, data, upload_files, message_queues): # 若尚未收到协议头先攒够16字节 if header_buf not in upload_files[sock]: upload_files[sock][header_buf] b upload_files[sock][header_buf] data if len(upload_files[sock][header_buf]) 16: return # 头没收全等下次recv # 解析协议头 header upload_files[sock][header_buf][:16] magic, total_size, name_len_b, _ struct.unpack(!4sQ2s2s, header) if magic ! bFILE: raise ValueError(非法协议头) name_len int.from_bytes(name_len_b, big) full_header_len 16 name_len if len(upload_files[sock][header_buf]) full_header_len: return # 文件名没收全 filename upload_files[sock][header_buf][16:full_header_len].decode() upload_files[sock][filename] filename upload_files[sock][total_size] total_size upload_files[sock][file] open(f./uploads/{filename}, ab) # 追加模式支持续传 upload_files[sock][header_buf] b # 清空缓存 # 剩余数据是块数据交给块解析器 remaining upload_files[sock][header_buf][full_header_len:] or b parse_chunks(sock, remaining, upload_files, message_queues) def parse_chunks(sock, data, upload_files, message_queues): # 简化假设data中包含完整块实际需缓冲区累积 while len(data) 8: # 块头8字节 chunk_id, crc32_expected struct.unpack(!II, data[:8]) chunk_data data[8:] # 校验CRC if zlib.crc32(chunk_data) ! crc32_expected: # 发送错误响应要求重传该块 message_queues[sock].append(bERR: CRC_MISMATCH) return # 写入文件注意这里需根据chunk_id计算偏移实际需维护已收块ID集合 upload_files[sock][file].write(chunk_data) upload_files[sock][file].flush() data data[8len(chunk_data):]参数选择依据chunk_size8192平衡网络效率和内存占用。小于4KB易受TCP Nagle算法影响小包合并延迟大于16KB在千兆网下提升有限但单块失败重传代价变大CRC32比MD5快10倍足够检测传输比特错误SHA256纯属过度设计追加模式open(..., ab)关键让seek()失效所有写入自动追加到文件末尾天然支持断点续传——客户端重连后服务端upload_files[sock][file]仍指向原文件write()继续追加。4. 断点续传与连接恢复当客户端拔网线服务端如何30秒内续上4.1 续传不是“重连即续”而是双向状态同步很多人以为“客户端重连后发个RESUME命令就行”但现实更复杂客户端可能崩溃重启丢失已传偏移量服务端可能重启内存中upload_files全丢网络抖动导致ACK丢失客户端误判“没收到”重复发块。可靠方案服务端持久化每个上传任务的状态到磁盘。我们用最简方式——为每个文件生成.state文件内容为JSON{ filename: firmware_v2.bin, total_size: 1048576, received_size: 852345, last_chunk_id: 104, timestamp: 1717023456 }服务端启动时扫描./uploads/*.state重建upload_files状态客户端重连后先发QUERY_STATE请求服务端返回received_size客户端从该偏移继续读文件。# state_manager.py状态持久化核心 import json import os import time STATE_DIR ./uploads def save_state(filename, received_size, last_chunk_id): state_file os.path.join(STATE_DIR, f{filename}.state) state { filename: filename, total_size: os.path.getsize(os.path.join(STATE_DIR, filename)), received_size: received_size, last_chunk_id: last_chunk_id, timestamp: int(time.time()) } with open(state_file, w) as f: json.dump(state, f) def load_state(filename): state_file os.path.join(STATE_DIR, f{filename}.state) if not os.path.exists(state_file): return None try: with open(state_file, r) as f: return json.load(f) except (json.JSONDecodeError, OSError): return None def cleanup_old_states(max_age_sec3600): # 清理1小时未更新的状态文件防磁盘占满 for f in os.listdir(STATE_DIR): if f.endswith(.state): path os.path.join(STATE_DIR, f) if time.time() - os.path.getmtime(path) max_age_sec: os.remove(path)4.2 心跳保活与超时清理别让僵尸连接吃光fdLinux默认TCP keepalive时间是2小时远超业务需求。我们必须自己实现客户端每30秒发PING服务端收到后回PONG并刷新该socket最后活跃时间主循环中遍历所有socket若time.time() - last_active 60主动close()。# 在2.2节主循环中加入心跳检查 last_active {} # {sock: timestamp} # 收到PING时更新 if data.startswith(bPING): last_active[sock] time.time() message_queues[sock].append(bPONG) # 主循环末尾加入超时清理 now time.time() for sock in list(read_sockets): if sock is not server_sock and sock in last_active: if now - last_active[sock] 60: print(f[超时踢出] {sock.getpeername()}) cleanup_socket(sock, read_sockets, write_sockets, message_queues, upload_files) last_active.pop(sock, None)注意cleanup_socket()需确保关闭文件、删除.state文件、从所有字典中移除该socket键值——漏删一个下次select就报Bad file descriptor。5. 避坑指南这5个坑让我重写了3遍服务端5.1 现象客户端上传1GB文件服务端内存涨到2GB才开始写盘原因message_queues[sock]里堆积了大量未发送的ACK响应而send()在TCP窗口满时会阻塞即使socket设为非阻塞send()在缓冲区满时仍可能返回0需重试。但代码里没做send()返回值判断直接把响应塞进队列队列无限增长。解决send()后检查返回值若sent len(data)把剩余数据放回队首并将该socket加入write_sockets列表等待下次可写事件——已在2.2节代码中体现。5.2 现象同一文件名多次上传后一次覆盖前一次且.state文件残留原因客户端重连后服务端用open(./uploads/firm.bin, ab)但第一次上传的.state文件还在load_state()返回旧偏移导致从中间开始写文件损坏。解决在handle_client_data()解析完协议头后先检查同名.state是否存在。若存在且total_size与当前头中一致则加载否则大小不同或文件已存在删除旧.state和旧文件重新开始——因为大小变了意味着是新版本文件。5.3 现象Windows客户端上传时服务端recv()偶尔收到0字节连接被误判断开原因Windows的TCP栈在某些网卡驱动下recv()返回0并不总代表对端关闭可能是驱动bug。解决不单靠recv()0判断断开增加getpeername()调用验证。若recv()返回0且getpeername()抛OSError才确认断开否则记录警告继续等待。5.4 现象并发100连接上传小文件10KBCPU使用率95%吞吐反而下降原因select.select()在连接数多时遍历socket列表的开销线性增长且每连接都频繁触发send()/recv()上下文切换过多。解决对小文件1MB启用“快速路径”——禁用分块直接sendall()并在select超时设为0.1秒而非1秒减少延迟。大文件走分块状态机小文件走直通混合策略。5.5 现象服务端部署在Docker中宿主机netstat看到大量TIME_WAIT端口耗尽原因服务端主动关闭连接如客户端正常退出后服务端close()进入TIME_WAIT状态默认持续2MSL约60秒。Docker默认不复用端口。解决server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)已启用再加socket.SO_LINGER设置为0强制RST关闭跳过TIME_WAIT仅限服务端作为连接关闭发起方时安全。6. 生产就绪技巧用systemd托管、日志分级、以及我压测时的3个关键阈值6.1 systemd服务化让服务随系统启动崩溃自动拉起把服务变成Linux标准守护进程避免nohup python server.py 这种野路子。创建/etc/systemd/system/tcp-file-server.service[Unit] DescriptionTCP File Transfer Server Afternetwork.target [Service] Typesimple Userdeploy WorkingDirectory/opt/tcp-file-server ExecStart/usr/bin/python3 /opt/tcp-file-server/server_select.py Restartalways RestartSec10 StandardOutputjournal StandardErrorjournal SyslogIdentifiertcp-file-server LimitNOFILE65536 [Install] WantedBymulti-user.target启用sudo systemctl daemon-reload sudo systemctl enable tcp-file-server.service sudo systemctl start tcp-file-server.service # 查看日志 sudo journalctl -u tcp-file-server.service -f关键配置说明LimitNOFILE65536突破Linux默认1024文件描述符限制支撑高并发Restartalways进程退出即重启配合RestartSec10防雪崩StandardOutputjournal日志进systemd journal可被ELK或Prometheus抓取。6.2 日志分级DEBUG只在开发开ERROR必须邮件告警日志不是越多越好。我的分层实践INFO连接建立/断开、文件开始/完成上传每条上传1条INFOWARNINGCRC校验失败、状态文件加载异常提示可能需人工介入ERROROSError写磁盘失败、select()系统调用失败必须告警DEBUG每块收发详情、select返回的socket列表长度仅调试开启。import logging from logging.handlers import SMTPHandler # 生产环境只开INFO及以上 logging.basicConfig( levellogging.INFO, format%(asctime)s %(levelname)s %(message)s, handlers[ logging.FileHandler(/var/log/tcp-file-server.log), logging.StreamHandler() # 输出到stdout供journal捕获 ] ) # ERROR级别邮件告警需配置SMTP if os.getenv(ALERT_EMAIL): mail_handler SMTPHandler( mailhost(smtp.example.com, 587), fromaddrserverexample.com, toaddrs[os.getenv(ALERT_EMAIL)], subjectTCP File Server ERROR, credentials(user, pass) ) mail_handler.setLevel(logging.ERROR) logging.getLogger().addHandler(mail_handler)6.3 压测得出的3个黄金阈值不调参性能砍半我在某模拟项目X中用locust对服务端压测100并发文件大小1MB~100MB得出以下硬指标不满足就该调参场景阈值不达标表现调优动作单连接吞吐≥ 80MB/s千兆网卡理论94MB/siftop显示单连接50MB/s检查chunk_size是否≥8KB确认客户端未启Naglesock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)100并发内存占用≤ 1.2GBps aux --sort-%memhead -5看到python进程1.5GB1GB文件上传稳定性0次重传0次CRC失败journalctl出现CRC_MISMATCH检查客户端网络是否启用了Deep Packet InspectionDPI设备其可能篡改TCP payload换用xxhash替代zlib.crc32更快更抗干扰最后说句实在话这个服务我最早写在树莓派上跑传感器数据回传后来搬到x86服务器扛工控机集群再后来容器化进K8s——它没用任何框架就靠对TCP本质的理解和对Linux系统调用的敬畏。每次想加个“炫酷功能”比如WebSocket兼容、HTTP接口我都先问自己这会让select()多一次系统调用吗会让write()多一次内存拷贝吗如果答案是肯定的我就砍掉。稳定压倒一切。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

WPF集成Chrome内核的三大硬伤与工程化解决方案

WPF集成Chrome内核的三大硬伤与工程化解决方案

简介:本资源是一套基于Chromium内核的WPF浏览器完整开发实践项目,面向.NET桌面应用开发者及WPF进阶学习者,解决在Windows平台高效集成高性能、可定制Web浏览能力的核心需求。项目深度融合WPF的XAML界面设计与数据绑定能力,以及Chr…

2026/10/15 0:19:16 阅读更多 →
Python数据采集分析可视化:疫情数据全链路实战

Python数据采集分析可视化:疫情数据全链路实战

1. 项目缘起与整体设计思路1.1 为什么选择“数据采集分析可视化”这条链路这个项目的核心目标很明确:把公开的疫情统计数据,从采集、清洗、分析到最终在网页上呈现,跑通一条完整的数据流水线。它不是一个单纯的爬虫练习,也不是一个…

2026/10/15 0:19:16 阅读更多 →
CSV编辑器实战:大文件不伤数据,命令行与脚本批量改列的完整方案

CSV编辑器实战:大文件不伤数据,命令行与脚本批量改列的完整方案

简介:一款面向数据分析、日常表格处理及数据库导入导出场景的轻量级CSV编辑工具,提供近似Excel的可视化操作界面,支持直接打开并编辑CSV文件,完成单元格增删改、行列操作、排序过滤、查找替换、数据验证等常见任务,适合…

2026/10/15 0:19:16 阅读更多 →

最新新闻

阿波罗11号技术拆解:系统工程与冗余设计的极致实践

阿波罗11号技术拆解:系统工程与冗余设计的极致实践

/* 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 1:11:54 阅读更多 →
LayUI后台界面开发实战:模块化加载与表格表单高效实现

LayUI后台界面开发实战:模块化加载与表格表单高效实现

简介:LayUI 是一款经典且轻量的 Web UI 前端开发框架,专为熟悉原生 HTML/CSS/JS 的开发者设计,用于快速搭建后台管理系统、企业官网及各类管理面板,有效解决组件复用、界面美观与跨屏适配等常见问题。无论是零基础的新手&#xff…

2026/10/15 1:11:54 阅读更多 →
PyCharm中numpy/pandas/matplotlib导入失败:根因与完整解决方案

PyCharm中numpy/pandas/matplotlib导入失败:根因与完整解决方案

/* 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 1:11:54 阅读更多 →
设备出海怎么联网?波兰物联网卡与国际物联网卡选型要点

设备出海怎么联网?波兰物联网卡与国际物联网卡选型要点

波兰部分城市正在推进远程抄表。从行业动态看,一些项目采用带GSM传输的智能水表,也有公社部署远程抄表装置,单台水表月均连接成本成为关注点。表面看只是换表,背后却把设备出海怎么联网推到台前。水表、气表、工业网关到了当地&am…

2026/10/15 1:11:54 阅读更多 →
LS-DYNA重启动技术原理与工程实践指南

LS-DYNA重启动技术原理与工程实践指南

1. 项目概述在工程仿真领域,重启动分析就像给一辆正在行驶的卡车更换发动机——既要保证车辆继续前进,又不能因为更换过程导致失控。LS-DYNA作为显式动力学分析的行业标准工具,其重启动功能是处理复杂仿真问题时不可或缺的"急救包"…

2026/10/15 1:11:54 阅读更多 →
Scrapy实战:抓取新片场作品数据并存入MySQL的完整方案

Scrapy实战:抓取新片场作品数据并存入MySQL的完整方案

/* 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 1:10:52 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

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

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/14 7:53:34 阅读更多 →