C++/MFC/MySQL网络对战游戏平台毕业设计:Socket通信与五子棋实现
简介这份资源是面向计算机软件专业本科毕业设计场景的《网络对战游戏平台系统设计》完整论文文档适合正在准备毕设选题、需要参考同类系统实现思路的学生以及想了解C网络编程与桌面应用开发的学习者。压缩包内共1个doc文件约682KB内容为一份结构完整的毕业论文涵盖绪论、理论技术基础、系统分析与设计、实现与测试等章节可据此梳理从选题背景到技术落地的写作框架。文档以C为核心语言结合MFC类库构建Windows用户界面并采用MySql完成用户信息与游戏数据的持久化存储重点实现了用户管理、游戏大厅与五子棋对战三大模块涉及Socket通信、TCP/UDP协议等知识点。目前已有142人学习读者可从中获取需求分析、模块划分、数据库设计及测试总结的完整参考对同类网络对战平台的开发与论文撰写具有直接的借鉴价值。1. 从一份 C/MFC/MySQL 毕业设计拆起网络对战游戏平台到底能跑通什么如果你手头正压着一个「网络编程 数据库 图形界面」三合一的课设或毕设又不想从零搭架子这份《网络对战游戏平台系统设计》值得先看一眼。它用 C 配合 MFC 做客户端界面MySQL 存用户和战绩Socket 走 TCP 做实时通信核心玩法是五子棋联机对战外围包了注册登录、游戏大厅、房间状态管理、公聊私聊、悔棋求和这一整套。说白了它不是一个玩具 demo而是一个能讲清楚 C/S 架构完整链路的可运行骨架。适合谁正在做计算机专业毕设、课程设计需要一份「有网络、有数据库、有界面、有游戏逻辑」的参考实现的人想练手 MFC 消息映射和 Socket 阻塞/非阻塞模型的人以及需要一套现成的用户表、房间状态机、胜负判定算法来改造成自己题目的开发者。不适合谁想直接拿去做商业上线的人也不适合完全没碰过 Visual Studio 和 C 编译链的新手——它默认你至少能配好环境、看懂 MFC 的文档视图结构。这份资源的真正价值在于「链路完整」从客户端点击登录到服务器查库验证再到大厅广播房间状态、房间内转发落子坐标、结束后写回战绩每一环都有对应代码位置。下面按「先立住原理再动手复现最后避坑」的顺序拆开讲。2. 技术选型与通信骨架为什么是 C/MFC/MySQL 这套组合2.1 三件套各自的职责边界先把这个系统的分层想清楚不然后面看代码会乱。C 负责所有业务逻辑和内存里的数据结构比如棋盘数组、房间对象、玩家状态MFC 负责把 Windows 窗口、按钮、列表控件、绘图 DC 这些 UI 元素和 C 逻辑绑在一起靠消息映射ON_BN_CLICKED、ON_WM_PAINT之类驱动MySQL 只干一件事——持久化用户注册信息、胜负平局数落库服务器启动时读出来对局结束时写回去。为什么不用 UDP五子棋是回合制每一步落子必须可靠到达对方丢一子整局就废了所以走 TCP 是合理选择。为什么不用现成的游戏引擎因为毕设要展示的是「你自己实现了通信和同步」用引擎反而把核心工作量藏起来了。这套选型在答辩时也站得住C 体现语言能力MFC 体现 Windows 编程MySQL 体现数据管理Socket 体现网络编程四个得分点全覆盖。2.2 Socket 通信模型服务端倾听、客户端连接系统的通信骨架是经典的 TCP 客户端/服务端模型。服务端创建一个监听 Socket绑定端口后进入listen状态用一个循环accept客户端连接每接受一个就开一条处理路径。客户端则主动connect到服务端 IP 和端口。原文里把 Socket 连接分成客户端连接、倾听连接、服务端连接三类本质就是「谁主动发起、谁被动等待」的区别。服务端要同时服务多个客户端常见做法是每个连接分配一个线程或者用select/WSAAsyncSelect做事件驱动。这份设计里服务器需要「一直接收不同客户端的连接请求」并且要转发聊天和游戏信息所以多连接管理是必须的。下面是一个服务端接受连接的最小骨架我按这个项目场景补全了关键注释// 服务端创建监听Socket并接受客户端连接 SOCKET listenSock socket(AF_INET, SOCK_STREAM, 0); // TCP流式套接字 SOCKADDR_IN addr; addr.sin_family AF_INET; addr.sin_port htons(9527); // 监听端口客户端要一致 addr.sin_addr.S_un.S_addr INADDR_ANY; // 接受任意网卡来源 bind(listenSock, (SOCKADDR*)addr, sizeof(addr)); listen(listenSock, SOMAXCONN); // 进入倾听状态排队上限 while (true) { SOCKADDR_IN clientAddr; int len sizeof(clientAddr); SOCKET clientSock accept(listenSock, (SOCKADDR*)clientAddr, len); if (clientSock INVALID_SOCKET) continue; // 每个客户端交给独立线程处理避免阻塞后续accept _beginthread(ClientThread, 0, (void*)clientSock); }逻辑说明socket创建套接字bind把端口和本机地址绑上listen让内核开始排队accept取出一个已完成三次握手的连接。参数上端口选 1024 以上避免权限问题SOMAXCONN是系统允许的最大排队数。_beginthread是 Windows 下的轻量线程创建方式把clientSock作为参数传进去每个线程独立收发互不阻塞。失败时重点看bind是否返回SOCKET_ERROR——多半是端口被占用或防火墙拦截。2.3 自定义消息结构让客户端和服务端说同一种话网络传输的是字节流双方必须约定好「第几个字节是什么」。这个系统定义了一个Message结构体包含消息类型iType、子类型iSubType、用户名strName、内容strContent。原文悔棋代码里就是先memset清零再填字段最后Send(msObj, sizeof(Message))整块发出去。// 双方共用的消息结构必须保证两端定义完全一致 struct Message { int iType; // 主类型登录/聊天/游戏/房间更新 int iSubType; // 子类型如游戏下的悔棋、求和、落子 char strName[32]; // 发送者用户名 char strContent[128]; // 载荷如坐标7|8或聊天文本 };这里有个血泪经验结构体里千万别用CString或std::string这种带指针的成员直接发因为指针在对方进程里是无效地址。必须用固定长度字符数组或者手动序列化成字节流。memset清零是为了避免上一轮的残留数据混进来。发送时用sizeof(Message)保证长度一致接收端也按同样大小recv否则会出现「粘包」——两次消息黏在一起读。常见做法是在消息头加一个长度字段接收端先读长度再读内容这个项目里如果消息都很短且定长直接整块收发也能跑但扩展性差。3. 数据库与用户管理user 表设计、注册登录校验怎么落地3.1 user 表字段与数据字典系统的持久化核心就一张user表字段包括 id、用户名、密码、胜利局数、失败局数、平局局数。原文数据字典给了长度id 整型长度 10用户名可变字符长度 10密码可变字符长度 16三个战绩字段都是整型长度 10。建表时对应下来大致是这样CREATE TABLE user ( id INT(10) NOT NULL AUTO_INCREMENT, username VARCHAR(10) NOT NULL, password VARCHAR(16) NOT NULL, win_count INT(10) DEFAULT 0, lose_count INT(10) DEFAULT 0, draw_count INT(10) DEFAULT 0, PRIMARY KEY (id), UNIQUE KEY uk_username (username) );逻辑说明AUTO_INCREMENT让 id 自增不用手动维护UNIQUE KEY加在用户名上从数据库层面保证不重名比在代码里先查再插更可靠能防并发下的重复注册。三个战绩字段给默认值 0新用户注册后直接可用。参数上VARCHAR(10)对用户名够用但如果要支持中文昵称得注意字符集设成utf8mb4否则中文会截断或乱码——这是新手最容易翻车的地方之一。3.2 注册与登录的校验流程注册流程客户端填服务器 IP、昵称、密码、确认密码两次密码必须一致才允许提交。服务端收到注册请求后先查user表里用户名是否存在存在则返回失败让客户端重新填不存在则INSERT新记录成功后直接进大厅。登录流程客户端填主机地址、用户名、密码服务端按用户名查库比对密码正确则放行并加载该用户的战绩错误则提示重新登录。// 服务端处理登录查库比对密码 bool CheckLogin(const char* name, const char* pwd, UserInfo out) { char sql[256]; sprintf(sql, SELECT id,password,win_count,lose_count,draw_count FROM user WHERE username%s, name); if (mysql_query(conn, sql) ! 0) return false; // 查询失败 MYSQL_RES* res mysql_store_result(conn); MYSQL_ROW row mysql_fetch_row(res); if (row NULL) { mysql_free_result(res); return false; } // 用户不存在 if (strcmp(row[1], pwd) ! 0) { mysql_free_result(res); return false; } // 密码错 out.win atoi(row[2]); out.lose atoi(row[3]); out.draw atoi(row[4]); mysql_free_result(res); return true; }逻辑说明mysql_query执行查询mysql_store_result把结果集拉到本地mysql_fetch_row取第一行。row NULL说明查无此人密码用strcmp比对。参数上sprintf拼 SQL 在这个规模够用但正式项目必须用预处理语句防注入——用户名里带个单引号就能把 SQL 拼坏这是安全上的硬伤。战绩字段用atoi转成整数存进UserInfo登录成功后客户端就能显示胜率。3.3 战绩写回与胜率计算一局结束后服务端根据结果更新对应字段赢的一方win_count1输的一方lose_count1和棋双方draw_count1。胜率不是存出来的是显示时算的win / (win lose draw)注意分母为 0 时要处理否则除零崩溃。// 对局结束写回战绩 void UpdateResult(const char* winner, const char* loser, bool isDraw) { char sql[256]; if (isDraw) { sprintf(sql, UPDATE user SET draw_countdraw_count1 WHERE username IN (%s,%s), winner, loser); } else { sprintf(sql, UPDATE user SET win_countwin_count1 WHERE username%s, winner); mysql_query(conn, sql); sprintf(sql, UPDATE user SET lose_countlose_count1 WHERE username%s, loser); } mysql_query(conn, sql); }逻辑说明和棋用一条IN语句同时更新两人分胜负则分两条更新。参数上draw_countdraw_count1是原地自增避免先读后写带来的并发覆盖。这里要注意如果服务器是多线程的多个对局同时写同一张表MySQL 的行锁能保证单条 UPDATE 原子性但「读胜率再显示」可能读到旧值对毕设来说可接受对正式项目得加事务或缓存。4. 游戏大厅与五子棋核心房间状态机、棋盘绘制、胜负判定4.1 房间状态机与大厅广播游戏大厅里每个房间有三种状态空闲、等待游戏、正在游戏。没有玩家时是空闲进了一个玩家变等待进两个及以上变正在游戏。服务器要定时通知所有在线客户端更新房间信息和玩家信息客户端收到后刷新列表。这个「定时广播」是保持各端视图一致的关键。// 服务端定时广播房间状态 void BroadcastRooms() { char buf[512] {0}; for (int i 0; i MAX_ROOM; i) { char tmp[64]; sprintf(tmp, room%d:%d;, i, rooms[i].state); // state:0空闲1等待2游戏中 strcat(buf, tmp); } Message msg; memset(msg, 0, sizeof(msg)); msg.iType ROOM_UPDATE; strcpy(msg.strContent, buf); for (auto s : onlineSockets) { // 遍历所有在线连接 send(s, (char*)msg, sizeof(msg), 0); } }逻辑说明把所有房间状态拼成一个字符串一次性广播给所有在线客户端减少网络往返。参数上MAX_ROOM是房间总数state用整数枚举。客户端收到ROOM_UPDATE后解析字符串刷新界面。这里有个坑如果在线连接列表在广播时被其他线程修改会崩溃所以遍历前要加锁或用快照。4.2 棋盘绘制与落子坐标换算五子棋棋盘是 15×15背景从 RGB(175,255,180) 到 RGB(115,220,200) 渐变还画了天元等点。绘制在 MFC 里走OnPaint用CPen画线、CBrush画棋子。鼠标点击后要把屏幕像素坐标换算成棋盘格坐标判断是否落在棋盘内是则落子。// 鼠标点击换算棋盘坐标并落子 void CChessView::OnLButtonDown(UINT nFlags, CPoint point) { int col (point.x - marginX gridSize / 2) / gridSize; // 四舍五入到最近格 int row (point.y - marginY gridSize / 2) / gridSize; if (col 0 || col 15 || row 0 || row 15) return; // 越界不处理 if (board[row][col] ! 0) return; // 该位置已有棋子 if (!m_isTurn) return; // 不是本方回合 board[row][col] m_myColor; // 1黑 2白 Invalidate(); // 触发重绘 SendMove(row, col); // 把坐标发给服务器转发 }逻辑说明marginX/marginY是棋盘左上角偏移gridSize是格子像素宽加gridSize/2再整除实现四舍五入让点击落在最近的交叉点。越界和重复落子都要拦掉。参数上board是 15×15 的整型数组0 空、1 黑、2 白。Invalidate触发OnPaint重画整个棋盘简单但效率一般正式项目可以只重画变化区域。4.3 胜负判定以最后一子为中心辐射判断胜负的算法是每下一子后以该子为中心向横、竖、左斜、右斜四个方向各数同色连续棋子任一方向达到五连即胜。这个算法只检查最后一子不用全盘扫描效率高。// 以(r,c)为中心判断是否五连 bool CheckWin(int r, int c, int color) { int dirs[4][2] {{0,1},{1,0},{1,1},{1,-1}}; // 横竖两斜 for (int d 0; d 4; d) { int cnt 1; // 包含当前子 for (int s 1; s 5; s) { // 正方向 int nr r dirs[d][0]*s, nc c dirs[d][1]*s; if (nr0||nr15||nc0||nc15||board[nr][nc]!color) break; cnt; } for (int s 1; s 5; s) { // 反方向 int nr r - dirs[d][0]*s, nc c - dirs[d][1]*s; if (nr0||nr15||nc0||nc15||board[nr][nc]!color) break; cnt; } if (cnt 5) return true; } return false; }逻辑说明四个方向数组覆盖横、竖、主对角、副对角。每个方向从中心向两侧延伸遇到边界或异色就停累计同色数达到 5 即胜。参数上color是当前落子方颜色board是全局棋盘。这个算法对「长连」六子以上也算胜标准五子棋里长连有时判禁手但毕设级别不用管那么细。4.4 悔棋与求和的通信处理悔棋客户端点悔棋按钮构造iTypeINGAME、iSubTypeREGRET的消息把上一步坐标放进strContent发给服务器服务器转发给对方双方各自撤销。原文代码里还设了m_isTurn和m_isCanRegret两个标志位控制「轮到本人下棋后不能悔棋」。求和点求和按钮发消息对方同意则本局判和双方draw_count1下一局重开不同意则继续。// 客户端发送悔棋请求 Message msObj; memset(msObj, 0, sizeof(Message)); msObj.iType INGAME; msObj.iSubType REGRET; CString strTemp theApp.m_skMainSocket.GetUserName(); lstrcpy(msObj.strName, strTemp.GetBuffer(strTemp.GetLength())); CString piecePos; piecePos.Format(_T(%ld|%ld), lastChess.x, lastChess.y); // 坐标用|分隔 lstrcpy(msObj.strContent, piecePos.GetBuffer(piecePos.GetLength())); theApp.m_skMainSocket.Send(msObj, sizeof(Message)); m_isTurn ISTURN; // 悔棋后轮次交还 m_isCanRegret DONOTREGRET; // 本回合不可再悔逻辑说明memset清零后填类型、子类型、用户名、坐标。坐标用x|y格式拼成字符串接收端按|拆分。Send整块发出。参数上m_isTurn控制回合权m_isCanRegret防止连续悔棋。这里要注意GetBuffer后最好调ReleaseBuffer否则 CString 的内部状态可能不一致——这是 MFC 字符串的经典坑。5. 避坑与排查这套 C/S 架构最容易翻车的五个地方5.1 现象客户端连不上服务器connect一直失败原因服务器 IP 填错、端口不一致、防火墙拦截或者服务端根本没listen。排查顺序是先确认服务端已启动且bind/listen没报错再用telnet 服务器IP 端口测端口通不通最后检查 Windows 防火墙是否放行了该端口。解决客户端和服务端的端口号必须完全一致服务端bind用INADDR_ANY接受所有网卡测试时先用本机127.0.0.1排除网络因素。5.2 现象消息收不全或两次消息黏在一起原因TCP 是字节流没有消息边界。发送端send一次接收端recv可能分几次收到也可能两次消息合并。这个项目用定长Message结构整块收发短消息下能跑但一旦变长就会出问题。解决在消息头加长度字段接收端先读固定长度的头解析出长度后再读够这么多字节。常见做法是定义一个MsgHeader{int len; int type;}先收头再收体。5.3 现象中文用户名或聊天内容乱码原因MySQL 表字符集不是utf8mb4或者 MFC 的CString在 Unicode 和多字节字符集之间转换出错。解决建库建表时指定CHARACTER SET utf8mb4连接时执行SET NAMES utf8mb4。MFC 项目里统一用_T()宏和TCHAR发送前把CString转成 UTF-8 字节数组接收端再转回来。别混用char和wchar_t否则一定乱码。5.4 现象多客户端同时操作时程序崩溃或数据错乱原因多个线程同时读写共享的board、房间状态、在线列表没有加锁。比如一个线程在遍历在线列表广播另一个线程正好有客户端断开要移除节点迭代器失效就崩。解决用临界区CRITICAL_SECTION或互斥量保护共享数据遍历前先拷贝一份快照再操作。数据库层面同一用户的战绩更新用原地自增win_countwin_count1而不是先读后写。5.5 现象悔棋后棋盘状态和对方不一致原因悔棋消息只发给了对方但本地没同步撤销或者撤销的坐标不是最后一步。原文用lastChess记录最后落子位置但如果网络延迟导致双方对「最后一步」的理解不同就会错位。解决悔棋请求里带上要撤销的坐标双方都按这个坐标撤销而不是各自删自己的最后一步。同时用m_isCanRegret标志位保证一回合只能悔一次避免连续悔棋把状态搞乱。6. 进阶改造与验证把毕设骨架变成能讲清楚的作品6.1 用日志验证通信链路是否真的通了答辩时最怕被问「你怎么证明消息真的发出去了」。我的习惯是在服务端每个关键节点打日志收到连接、收到登录请求、查库结果、转发消息、写回战绩全部带时间戳和用户名输出到文件。这样一旦某一步没日志就能定位是客户端没发、网络没到、还是服务端没处理。// 简易日志定位消息在哪一环断掉 void Log(const char* fmt, ...) { FILE* fp fopen(server.log, a); if (!fp) return; va_list args; va_start(args, fmt); time_t t time(NULL); fprintf(fp, [%s] , ctime(t)); // 时间戳 vfprintf(fp, fmt, args); fprintf(fp, \n); va_end(args); fclose(fp); }逻辑说明用可变参数让日志像printf一样用ctime加时间戳追加模式写文件。参数上日志文件路径固定正式项目要按天切分。验证方法客户端登录一次看服务端日志是否依次出现「accept」「login request」「db query ok」「login success」缺哪条就查哪段。6.2 把胜负判定抽成独立函数方便测试棋盘逻辑和网络逻辑混在一起是毕设通病改起来牵一发动全身。我一般会把CheckWin、落子合法性、悔棋撤销这些纯逻辑抽到一个ChessLogic类里不依赖 Socket 和 MFC这样可以用控制台程序单独跑测试用例构造一个棋盘手动填子调CheckWin看返回值对不对。测试场景棋盘构造期望结果横向五连第 7 行连续 5 个黑子返回 true竖向四连第 7 列连续 4 个白子返回 false主对角五连(3,3)到(7,7) 黑子返回 true边界四连第 0 行 4 个黑子返回 false长连六子连续 6 个黑子返回 true毕设不判禁手这张表可以直接当答辩时的测试证据比口头说「我测过了」有说服力。6.3 房间状态用枚举而不是魔法数字原文房间状态用 0/1/2 表示空闲/等待/游戏中代码里到处是数字读起来费劲还容易写错。改成枚举enum RoomState { ROOM_IDLE 0, ROOM_WAITING 1, ROOM_PLAYING 2 };这样if (rooms[i].state ROOM_PLAYING)比 2清楚得多也方便以后加状态。同理消息类型、棋子颜色、回合标志都该用枚举或常量别散落魔法数字。6.4 数据库连接别每次操作都开闭新手常犯的错是每次查库都mysql_initmysql_real_connectmysql_close连接开销大还容易泄漏。正确做法是服务端启动时建一个全局连接或者用连接池所有查询复用。如果多线程访问同一个MYSQL*要么加锁串行化要么每线程一个连接——MySQL 的 C API 不是线程安全的共享连接必须自己同步。6.5 从这份设计能延伸出什么这套骨架改一改就能换游戏把五子棋的棋盘和胜负判定换成象棋、围棋或井字棋通信和房间管理几乎不用动。也能加功能观战模式原文已提到观看者角色、排行榜按胜率排序查库、断线重连记录用户会话。答辩时如果能说清楚「我的架构哪里可扩展、哪里是瓶颈」比单纯演示功能更能拿分。从那以后我每次拿到这类 C/S 毕设都强制先跑通「登录→进大厅→开一局→落子→判胜→写库」这条最小闭环再去看其他分支功能。链路不通功能再多都是空中楼阁。希望这份拆解帮到你需要完整设计文档和源码的可以按项目名去对应资源处获取。本文还有配套的精品资源点击获取

相关新闻

LangChain RAG 问答应用实战:从 PDF 索引到多轮对话调优

LangChain RAG 问答应用实战:从 PDF 索引到多轮对话调优

简介:这份PDF面向大模型与人工智能方向的学习者及面试准备者,聚焦基于langchain框架的RAG问答应用实战,帮助读者理解检索增强生成从数据准备到问答落地的完整链路。资源包内仅含1个PDF文件,约390KB,内容以图文与代码示…

2026/9/30 14:51:53 阅读更多 →
PyTorch PolynomialLR学习率调度:原理、参数详解与工程实践避坑指南

PyTorch PolynomialLR学习率调度:原理、参数详解与工程实践避坑指南

聊到深度学习训练里那个“最后一段路怎么走”,我最近几年最常写进代码的就是 PyTorch 自带的 PolynomialLR 。它其实很简单:用一条多项式曲线把学习率从初始值平滑地拉低,最后停在你指定的一个低位上。没有花哨的自动监控,也不需…

2026/9/30 14:51:53 阅读更多 →
VSCode Python开发环境配置:MS Python插件与避坑指南

VSCode Python开发环境配置:MS Python插件与避坑指南

简介:这份PDF资料面向使用VSCode进行Python开发的程序员,尤其是希望把编辑器打造成高效IDE的初学者与进阶者,系统梳理了微软官方MS Python插件及配套扩展的实用配置。内容围绕静态代码扫描、智能提示与自动补全、自动缩进、代码格式化、代码重…

2026/9/30 14:51:53 阅读更多 →

最新新闻

OpenStack源码解读:从Nova入手掌握核心架构与调试技巧

OpenStack源码解读:从Nova入手掌握核心架构与调试技巧

简介:这份《OpenStack技术源码模块解读》面向云计算开发与运维人员、源码阅读爱好者,以及希望从IaaS层理解OpenStack架构的中高级学习者,帮助解决组件繁杂、源码入门无从下手的问题。资源以Nova项目为主线,系统梳理OpenStack从最初…

2026/9/30 15:30:09 阅读更多 →
全球户用储能逆变器出货量排行榜 2025:三条数据,别混着用

全球户用储能逆变器出货量排行榜 2025:三条数据,别混着用

户用光储是 2026 年上半年增速最快的细分市场之一。第三方机构的统计显示,全球户用储能系统出货量同比翻了一倍多,澳大利亚、欧洲与新兴市场一起放量。市场跑得快,榜单就多,而查户用储能逆变器出货量排行榜时最容易出错的地方&…

2026/9/30 15:30:09 阅读更多 →
政企网站内容合规巡查怎么做?一篇讲清范围、重点和方法

政企网站内容合规巡查怎么做?一篇讲清范围、重点和方法

"内容合规"这四个字,这两年在政企单位里被提得越来越多。过去,很多单位对网站内容的管理,停留在"别出错别字"的层面。可如今,内容合规的范围要宽得多:表述是否规范、链接是否有效、页面是否被篡改…

2026/9/30 15:30:09 阅读更多 →
GPU租用不再花冤枉钱:计费模式、选型与防坑实战

GPU租用不再花冤枉钱:计费模式、选型与防坑实战

GPU按需租用早已不是新鲜事,但租卡这潭水,远比你想象的深。身边不少朋友都在跑大模型微调、ComfyUI出图、Pytorch训练,看起来都是在“租GPU”,但每月账单能差出2到3倍,性能体验更是天壤之别。有人用抢购的竞价实例把训…

2026/9/30 15:30:09 阅读更多 →
什么是面齿轮?一篇看懂它的结构与特点

什么是面齿轮?一篇看懂它的结构与特点

在直升机、机器人关节、新能源汽车电驱桥等高端传动系统中,一种新型齿轮正在越来越多地被采用——它就是面齿轮。很多人第一次看到面齿轮时会问,它到底是齿轮还是端面齿盘?它与锥齿轮有什么区别?为什么它能实现更高扭矩密度、更低…

2026/9/30 15:30:09 阅读更多 →
含泪总结veyon的编译,Veyon-4.11-2+VMware 17+ubuntu26.04+cmake+qt5.15用 kimi不要用豆包和deepseek这两个大傻子。

含泪总结veyon的编译,Veyon-4.11-2+VMware 17+ubuntu26.04+cmake+qt5.15用 kimi不要用豆包和deepseek这两个大傻子。

在windows解决不了的问题在linux就能解决: 1.windowqt,得自己去找三方库,添加,编译。各种环境配置,还有软件版本问题。 2.linux有一个包管理器,就像万事通魔镜,只要一行代码就能解决以上所有问题…

2026/9/30 15:29:08 阅读更多 →

日新闻

Base64 图片头部特征识别:从文件头到格式判断的完整指南

Base64 图片头部特征识别:从文件头到格式判断的完整指南

1. 项目概述:为什么说看懂 base64 图片头部是基本功这几年跟 base64 打交道的机会越来越多,后端接口返回图片、前端渲染验证码、小程序里存小图、还有一些老系统导出报表,动不动就给你一段长到怀疑人生的 base64 字符串。很多人拿到字符串就直…

2026/9/30 0:00:35 阅读更多 →
Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

简介:本资源是一份面向Java初学者与课程设计学生的公交站牌广告灯箱管理系统毕业设计文档,聚焦城市公共广告资源信息化管理痛点,提供从需求分析到技术实现的完整方案。文档采用标准学术论文结构,含摘要、英文摘要、目录及五章正文…

2026/9/30 0:00:35 阅读更多 →
用 Redis Lua 构建大模型 API 多租户原子配额治理体系

用 Redis Lua 构建大模型 API 多租户原子配额治理体系

我去年年底接了一个内部 AI 平台的治理需求,背景很直接:公司把 DeepSeek、MiniMax 这类大模型 API 统一封装成内部网关,开放给几个业务团队用。结果第一个月账单出来,额度直接超了 4 倍。仔细查日志,发现原因并不复杂—…

2026/9/30 0:00:35 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 16:41:41 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/29 19:29:29 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/30 15:27:04 阅读更多 →