第 16 / 20 篇

第 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 或协议设计,不必立即钻进所有底层源码。