第 15 章 两周学习路线与进阶项目
15.1 每天 30~60 分钟
| 天数 | 任务 | 完成标准 |
|---|---|---|
| 第 1 天 | 阅读第 1~2 章 | 用自己的话解释端口与字节流 |
| 第 2 天 | 运行服务端和客户端 | 看见两条预期响应 |
| 第 3 天 | 手抄启动代码 | 说清 boss、worker 与 bind |
| 第 4 天 | 阅读 Pipeline | 画出双向处理顺序 |
| 第 5 天 | 修改业务回复 | 预测并验证输出 |
| 第 6 天 | 学习帧边界 | 解释半包与粘包 |
| 第 7 天 | 阅读与运行测试 | 看懂每个断言的目标 |
| 第 8 天 | 学习 ByteBuf | 区分读写下标与引用计数 |
| 第 9 天 | 练习长度字段 | 从协议表推出解码器参数 |
| 第 10 天 | 设计心跳 | 写清超时、应答与关闭规则 |
| 第 11 天 | 理解线程与队列 | 找出哪些操作会阻塞 |
| 第 12 天 | 按排错表演练 | 故意去掉换行并定位原因 |
| 第 13 天 | 实现一个扩展命令 | 添加代码和行为测试 |
| 第 14 天 | 复述完整请求路径 | 从字节到业务再到响应讲一遍 |
如果 Java 基础薄弱,可以把每一天扩展为两到三天。进度的标准是能够解释和复现,不是翻过多少页。
15.2 第一个扩展:命令式小服务
在行协议上增加三个命令:ECHO 内容 原样返回内容,TIME 返回当前时间,QUIT 回复后关闭。先写命令大小写、空参数、未知命令和空行的处理规则,再实现。
验收时至少覆盖:一条命令分两次到达;一次输入多条命令;中文内容;未知命令;超长输入;退出应答。不要只测试新命令的正常路径。
15.3 第二个扩展:请求编号
约定 请求编号|命令|参数 的文本格式,响应保留请求编号。明确参数中是否允许 |,若允许,就设计转义或换用成熟序列化格式。
随后让客户端同时发送多个请求,维护待处理表与超时。观察关闭连接时是否清理全部待处理项。这一步能够把“TCP 连接”与“业务请求”真正区分开来。
15.4 第三个扩展:聊天服务
为每条连接增加昵称与登录状态,把消息广播给其他连接。要考虑昵称冲突、断线清理、慢客户端、广播消息所有权与房间容量。
先用不可变字符串做广播,可以减少 ByteBuf 所有权问题。共享房间表需要线程安全设计,因为不同连接可能由不同 EventLoop 管理。不要为了复用,把所有连接状态随意塞入一个未同步的 HashMap。
到这里,你已经具备继续阅读官方示例和更复杂协议实现的基础。下一步可以按兴趣学习 HTTP、WebSocket、TLS 或协议设计,不必立即钻进所有底层源码。