# CloudComputeBookCode **Repository Path**: fang-lianlian/cloud-compute-book-code ## Basic Information - **Project Name**: CloudComputeBookCode - **Description**: Code related to our first cloud computing book - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 147 - **Created**: 2026-03-18 - **Last Updated**: 2026-04-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # CloudComputeBookCode 面向云计算技术课程实践的代码仓库,涵盖网络编程、并发控制、分布式系统等多个核心主题。仓库包含完整的教学演示代码、学生实验任务以及多人对战游戏的核心实现。 ## 仓库概览 本仓库围绕云计算技术课程的实践环节设计,以网络程序设计与多人交互式系统实现为核心,通过渐进式的实验体系帮助学生掌握关键概念。 - **`CourseCode/`** - 课程教学示例代码,包含完整可运行的演示程序 - **`Lab/`** - 学生实验任务,涵盖网络编程、并发控制、分布式系统 - **`warzone/`** - 多人对战游戏核心项目,提供 Go 和 C++ 两套完整实现 ## 目录结构 ```text . |-- CourseCode/ # 课程教学示例代码 | |-- ch3/ # 第3章:双雄对决演示实验 | |-- ch4/ # 第4章:英雄集结演示实验 | |-- ch5/ # 第5章:裂土封疆演示实验 | `-- ch6/ # 第6章:飞升入定演示实验 | |-- Lab/ # 学生实验任务 | |-- Lab1/ # Lab1:网络编程(C/S架构双人对战) | |-- Lab2/ # Lab2:并发编程(Goroutine + 锁) | `-- Lab3/ # Lab3:分布式战场与多服协同 | |-- warzone/ # 多人对战游戏核心项目 | |-- c++/ # C++ 完整实现版本 | `-- go/ # Go 完整实现版本 | `-- README.md # 本文件 ``` --- ## CourseCode - 课程教学示例 ### CourseCode/ch3 - 双雄对决演示实验 **主题**:网络编程基础、TCP通信、帧同步、权威服务器 本目录包含 7 个渐进式的可运行演示程序,完整展示从单机游戏到网络多人游戏的演进过程: | 实验序号 | 实验名称 | 核心知识点 | |---------|---------|-----------| | 实验① | 单机游戏主循环 | Game Loop(输入→计算→渲染) | | 实验② | TCP Socket 通信 | `net.Listen`、`net.Dial`、连接管理 | | 实验③ | TCP 粘包与消息序列化 | 长度前缀+JSON、解决粘包/半包问题 | | 实验④ | P2P 确定性帧同步 | Lockstep、DeterministicUpdate | | 实验⑤ | C/S 并发连接管理 | `go handleClient()`、阻塞 vs 并发 | | 实验⑤.1 | TCP 半开连接问题 | 僵尸玩家、超时非阻塞读取 | | 实验⑥ | 权威服务器 | 服务端唯一真相、客户端只发输入+渲染 | | 实验⑦ | 健壮网络通信库 | `ReliableConn`、超时机制、防粘包 | **快速启动**: ```bash cd CourseCode/ch3 go run ./cmd/exp1/loop # 单机游戏 go run ./cmd/exp4/p2p_lockstep_host # P2P锁步 go run ./cmd/exp6/authoritative_server # 权威服务器 ``` 详细说明见 [CourseCode/ch3/README.md](CourseCode/ch3/README.md) ### CourseCode/ch4 - 英雄集结演示实验 **主题**:Go 并发编程、同步原语、性能优化、分层存储 本目录包含 6 个演示实验,涵盖并发编程的各个方面: | 实验序号 | 实验名称 | 核心知识点 | |---------|---------|-----------| | 实验① | 突破单线程瓶颈 | 串行阻塞、Goroutine解耦、事件驱动 | | 实验② | 临界区与数据竞争 | Race Condition、`sync.Mutex` | | 实验③ | 告别忙等 | 忙等问题、`sync.Cond` | | 实验④ | 锁的进阶技巧 | Channel信号量、超时锁、`sync.RWMutex` | | 实验⑤ | 高并发性能榨取 | `sync.Pool`、对象复用、GC优化 | | 实验⑥ | 游戏数据分层存储架构 | Redis、PostgreSQL、Write Through、Cache Aside | **快速启动**: ```bash cd CourseCode/ch4 go run ./cmd/exp2/right # Mutex修复版 go run ./cmd/exp3/cond_wait # Cond等待 go run ./cmd/exp4/rw_mutex # 读写锁 ``` 详细说明见 [CourseCode/ch4/README.md](CourseCode/ch4/README.md) ### CourseCode/ch5 - 裂土封疆演示实验 **主题**:分布式系统基础、服务发现、负载均衡 (具体内容详见 [CourseCode/ch5/裂土封疆演示实验.md](CourseCode/ch5/裂土封疆演示实验.md)) ### CourseCode/ch6 - 飞升入定演示实验 **主题**:分布式一致性、CAP理论、故障容错 (具体内容详见 [CourseCode/ch6/飞升入定演示实验.md](CourseCode/ch6/飞升入定演示实验.md)) --- ## Lab - 学生实验任务 ### Lab1 - 网络编程:双人对战游戏(C/S架构) **总分**:20分 **实验目标**: - 掌握 TCP 网络编程(`net.Listen`/`net.Dial`) - 理解 JSON 序列化与消息收发 - 理解 C/S 架构(服务端权威模型) - 实现基础游戏逻辑(移动、攻击) **核心任务**: - 建立TCP连接(服务端监听、客户端连接) - 实现网络消息收发(JSON序列化) - 实现游戏逻辑(坐标边界检查、攻击范围判断) **运行方式**: ```bash cd Lab1/student go run ./cmd/server # 启动服务器 go run ./cmd/client # 启动客户端(另开终端) ``` 详细说明见 [Lab/Lab1/README.md](Lab/Lab1/README.md) ### Lab2 - 并发编程:多人开放世界对战(Goroutine + 锁) **总分**:20分 **前置要求**:已完成 Lab 1 **实验目标**: - 理解 Goroutine(Go 的轻量级并发单元) - 掌握 `sync.RWMutex`(读写锁) - 识别并修复数据竞争 - 设计并发安全 API **核心任务**: - 实现并发安全的世界状态操作(`AddPlayer`、`RemovePlayer`、`MovePlayer`、`AttackPlayer`、`GetSnapshot`) - 启动广播 Goroutine(定期推送世界快照) - 为每个客户端连接启动独立 Goroutine - 客户端接收 Goroutine(边按键边收网络消息) **运行方式**: ```bash cd Lab2/student go run ./cmd/server # 启动服务器 go run ./cmd/client # 启动客户端(可多个) ``` 数据竞争检测: ```bash go run -race.race ./cmd/server # 检测数据竞争 ``` 详细说明见 [Lab/Lab2/README.md](Lab/Lab2/README.md) ### Lab3 - 分布式战场与多服协同 **总分**:15分 **前置要求**:已完成 Lab 1 和 Lab 2 **实验目标**: - 实现多地图并行运行 - 实现多服务节点协同处理 - 热数据和冷数据分层存储 - 节点故障、主从切换与状态恢复 **核心任务**: - `AttackBoss`:世界首领的全服共享协同结算 - `SwitchMap`:跨地图切换和会话迁移 - `persistSessionState`:热数据和冷数据落盘 - `checkpointLoop`:地图检查点的周期性复制 - `handleNodeFailure`:故障切换和主从提升 **运行方式**: ```bash cd Lab3/student go run ./cmd/server # 启动网关服务器 go run ./cmd/client # 启动客户端 go run ./cmd/admin 状态 # 管理命令 ``` 详细说明见 [Lab/Lab3/README.md](Lab/Lab3/README.md) --- ## warzone - 多人对战游戏核心项目 ### warzone/go - Go 语言完整实现 **特性**: - 完整的 C/S 架构多人对战游戏 - 支持多玩家实时对战 - 账号注册/登录系统 - 战绩持久化存储 - 武器系统(地图刷新武器) - 差异渲染(消除闪烁) - 心跳检测与断线处理 **文件结构**: ``` go/ ├── cmd/ │ ├── server/main.go # 服务器入口 │ └── client/main.go # 客户端入口 └── internal/ ├── protocol/protocol.go # 网络协议 ├── database/database.go # 文件型数据库 ├── server/ # 服务端实现 └── client/ # 客户端实现 ``` **运行方式**: ```bash cd warzone/go go run ./cmd/server # 启动服务器(默认端口9000) go run ./cmd/client # 启动客户端 go run ./cmd/client 9000 # 连接局域网服务器 ``` 详细说明见 [warzone/go/README.md](wazone/go/README.md) ### warzone/c++ - C++ 完整实现 **特性**: - 与 Go 版本功能对等的 C++ 实现 - 使用 `std::thread` 实现多线程并发 - `std::mutex` 保护共享状态 - TCP_NODELAY 优化消除延迟 - 差异渲染消除闪烁 **文件结构**: ``` c++/ ├── protocol.h # 网络协议 ├── database.h # 数据库 ├── server.cpp # 服务器 ├── client.cpp # 客户端 └── data/ # 运行时数据目录 ``` **运行方式**: ```bash cd warzone/c++ make # 编译 ./server # 启动服务器 ./client # 启动客户端 ./client 9000 # 连接局域网服务器 ``` 详细说明见 [warzone/c++/README.md](warzone/c++/README.md) --- ## 环境要求 ### 基础要求 - Go 1.21 或更高版本 - C++17 兼容编译器(GCC 7+ / Clang 5+ / MSVC 2017+) ### 可选依赖 - Docker Desktop(用于 CourseCode/ch4 实验6的 Redis + PostgreSQL) --- ## 快速开始 ### 1. 运行课程演示示例 ```bash # 双雄对决演示实验(网络编程基础) cd CourseCode/ch3 go run ./cmd/exp1/loop # 英雄集结演示实验(并发编程) cd CourseCode/ch4 go run ./cmd/exp2/right ``` ### 2. 完成实验任务 ```bash # Lab1:网络编程基础 cd Lab1/student go run ./cmd/server # 终端1 go run ./cmd/client # 终端2 # Lab2:并发编程 cd Lab2/student go run ./cmd/server # 终端1 go run ./cmd/client # 终端2,3,4...(多个客户端) # Lab3:分布式系统 cd Lab3/student go run ./cmd/server # 终端1 go run ./cmd/client # 终端2 ``` ### 3. 运行完整游戏 ```bash # Go版本 cd warzone/go go run ./cmd/server # 终端1 go run ./cmd client # 终端2,3... # C++版本 cd warzone/c++ make ./server # 终端1 ./client # 终端2,3... ``` --- ## 学习路径建议 本仓库按以下学习路径设计,建议循序渐进: 1. **CourseCode/ch3** - 掌握网络编程基础 - 理解TCP连接建立 - 掌握消息序列化与反序列化 - 理解P2P锁步与权威服务器架构 2. **Lab1** - 实践C/S架构 - 完成基础的双人对战游戏 - 理解服务端权威模型 3. **CourseCode/ch4** - 掌握并发编程 - 理解竞态条件与锁 - 掌握Goroutine与Channel - 学习性能优化技巧 4. **Lab2** - 实践并发编程 - 将Lab1扩展为多人实时对战 - 使用RWMutex保护共享状态 5. **Lab3** - 掌握分布式系统 - 实现多地图、多节点协同 - 理解热冷数据分层存储 - 掌握故障容错与高可用 6. **warzone** - 完整项目参考 - 阅读完整的生产级代码 - 对比Go与C++的实现差异 --- ## 常见问题 ### Q: 运行实验时提示端口已被占用 A: 使用 `lsof -i :<端口号>` (macOS/Linux) 或 `netstat -ano | findstr :<端口号>` (Windows) 查找占用进程并关闭 ### Q: 客户端无法连接服务器 A: 检查防火墙设置,确保对应端口已开放。对于局域网连接,确认服务器IP地址正确 ### Q: 编译C++版本时出错 A: 确保编译器支持C++17标准。GCC/Clang使用 `-std=c++17`,MSVC使用 `/std:c++17` ### Q: Go模块依赖下载失败 A: 设置国内代理:`go env -w GOPROXY=https://goproxy.cn,direct` --- ## 许可证 本仓库为教学用途,遵循 MIT 许可证。 --- ## 贡献 欢迎提交 Issue 和 Pull Request 来改进本仓库的教学内容。