《Java 网络编程基础》全 50 篇,是「Java 网络与 Netty」三卷本的第一卷。它不引入 Netty、OkHttp 或 Spring,只用 JDK 25 自带的
Socket、ServerSocket、SocketChannel、Selector、ByteBuffer和SSLEngine,把「一次请求到底经过哪些层」拆成可运行的代码与可复现的实验。
本页是《Java 网络编程基础》的全书目录:按章节顺序列出全部 50 篇,点击标题直达正文。也可以从各节末尾的「阅读导航」按顺序通读,或先看目录篇 里的三条学习路径。
全书概览
| 项目 | 内容 |
|---|---|
| 书稿 | 《Java 网络编程基础》 |
| 篇数 | 50 篇(15 章 45 节 + 序、前言、目录 + 附录 A/B) |
| 领域 | Java 网络编程、NIO、Reactor、HTTP/TLS/WebSocket 协议实现 |
| 贯穿项目 | linkd —— 一个只用 JDK 的连接服务器,逐章长出拆帧、事件循环与协议层 |
| 上游项目 | libraryd —— 卷三的 Javalin 服务,本卷用 linkd 解释它下面发生了什么 |
| 阅读方式 | 从目录篇 进入按顺序通读,或按症状跳读 |
| 主线版本 | JDK 25 LTS(Temurin 25.0.5+8)、Maven 3.9.12 |
| 关键依赖 | 无第三方网络库;只用 JDK 25 标准库 |
| 上级专题 | 书稿专题 |
全书目录
前置
| 节 | 文章 | 核心内容 |
|---|---|---|
| — | 序:为什么还要学 JDK 原生网络编程 | 三卷本定位、与 Netty 的关系、学习预期 |
| — | 前言:读法、环境与约定 | 版本、机器口径、代码约定与实验方法 |
| — | 目录与学习路径 | 三条学习路径、十五章结构、项目状态 |
第一部分:地图、语义与连接(第 1–3 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 1.1 | 1.1 从一次 HTTP 请求看 Java 网络栈 | 请求路径、内核缓冲区、accept 队列、Java 可见边界 |
| 1.2 | 1.2 BIO、NIO、AIO 与 Reactor 模型 | 阻塞/非阻塞、就绪/完成、单线程与主从 Reactor |
| 1.3 | 1.3 linkd 项目与实验环境 | 四模块骨架、LinkdMain、端口与诊断命令 |
| 2.1 | 2.1 TCP 连接、字节流与可靠性边界 | 三次握手、四次挥手、字节流无边界、可靠性不等于低延迟 |
| 2.2 | 2.2 UDP 数据报、MTU 与丢包 | DatagramSocket、MTU、分片、应用层重传 |
| 2.3 | 2.3 InetAddress、端口与网络接口 | 地址解析、NetworkInterface、绑定地址与回环 |
| 3.1 | 3.1 Socket 与 ServerSocket 基本用法 | accept、读写、backlog、一个连接一个线程 |
| 3.2 | 3.2 连接、读、写超时 | connect 超时、SO_TIMEOUT、写超时为何不存在 |
| 3.3 | 3.3 半关闭、RST 与优雅关闭 | shutdownOutput、RST 触发条件、SO_LINGER |
第二部分:字节与事件循环(第 4–7 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 4.1 | 4.1 字节序、字符集与边界 | ByteOrder、UTF-8、CharsetDecoder、截断字符 |
| 4.2 | 4.2 定长、分隔符与长度域帧 | 三种成帧、最大长度、半包与多帧 |
| 4.3 | 4.3 编解码器设计与错误处理 | 编解码器接口、异常策略、FrameDecoder |
| 5.1 | 5.1 Buffer 的 position、limit 与 flip | 三值状态、flip/clear/compact、读写切换 |
| 5.2 | 5.2 DirectBuffer 与堆外内存 | 分配成本、Cleaner、堆内与堆外对照 |
| 5.3 | 5.3 FileChannel、Scatter/Gather 与零拷贝 | transferTo、readv/writev、适用边界 |
| 6.1 | 6.1 Selector 就绪事件与 interestOps | OP_ACCEPT/READ/WRITE、select、wakeup |
| 6.2 | 6.2 单线程 Reactor 实现 | register、事件分发、读写回调 |
| 6.3 | 6.3 多线程 Reactor 与主从模型 | boss/worker、跨线程注册、负载分配 |
| 7.1 | 7.1 非阻塞 accept、read 与 write | configureBlocking(false)、返回 0 与 -1、写半包 |
| 7.2 | 7.2 半包、粘包与缓冲区增长 | 累积缓冲、上限、压缩与扩容 |
| 7.3 | 7.3 连接状态机与空闲检测 | 连接状态、lastRead、定时扫描与关闭 |
第三部分:协议实现(第 8–11 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 8.1 | 8.1 请求行、头部与消息体 | 请求行解析、头部大小限制、Content-Length |
| 8.2 | 8.2 keep-alive、chunked 与管线化 | 连接复用、chunk 解码、响应顺序 |
| 8.3 | 8.3 路由、静态文件与错误响应 | HttpRouter、/healthz、404/500 与静态文件 |
| 9.1 | 9.1 HTTP/2 帧类型与流状态 | 9 字节帧头、SETTINGS、流状态机 |
| 9.2 | 9.2 HPACK 与头部压缩 | 静态表、动态表、Huffman、整数编码 |
| 9.3 | 9.3 多路复用、流量控制与优先级 | stream ID、WINDOW_UPDATE、优先级取舍 |
| 10.1 | 10.1 TLS 1.3 握手与证书链 | 1-RTT、keytool、证书链与 SAN |
| 10.2 | 10.2 SSLEngine 非阻塞握手 | wrap/unwrap、NEED_TASK、握手状态 |
| 10.3 | 10.3 会话复用、ALPN 与证书校验 | session ticket、ALPN h2、主机名校验 |
| 11.1 | 11.1 WebSocket 握手与 Upgrade | Sec-WebSocket-Key、101、协议切换 |
| 11.2 | 11.2 帧格式、掩码与分片 | opcode、mask、continuation、控制帧 |
| 11.3 | 11.3 心跳、关闭与广播 | ping/pong、关闭码、会话表与广播 |
第四部分:运行时工程(第 12–14 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 12.1 | 12.1 事件循环与任务队列 | execute、任务队列、禁止阻塞事件循环 |
| 12.2 | 12.2 业务线程池与阻塞隔离 | 池大小、队列、拒绝策略、虚拟线程对照 |
| 12.3 | 12.3 上下文传播与线程安全 | ThreadLocal、ScopedValue、不可变消息 |
| 13.1 | 13.1 零拷贝的系统调用边界 | sendfile/mmap 的 JDK 抽象与适用条件 |
| 13.2 | 13.2 DirectByteBuffer 分配与回收 | Cleaner、MaxDirectMemory、池化 |
| 13.3 | 13.3 内存映射与文件传输 | MappedByteBuffer、transferTo、静态文件 |
| 14.1 | 14.1 读写水位与背压信号 | 高/低水位、暂停读、队列上限 |
| 14.2 | 14.2 超时、重试与幂等边界 | 超时分层、重试放大、幂等键 |
| 14.3 | 14.3 优雅关闭与连接排空 | SIGINT、停止 accept、排空、关闭期限 |
第五部分:验证与收口(第 15 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 15.1 | 15.1 tcpdump、netstat 与连接诊断 | lo0 抓包、连接状态、fd 与端口 |
| 15.2 | 15.2 压测工具与指标口径 | ab、吞吐/分位、协调缺失、Little’s law |
| 15.3 | 15.3 linkd v1 验收与故障复盘 | 验收清单、故障注入、复盘模板 |
附录
| 节 | 文章 | 核心内容 |
|---|---|---|
| A | 附录 A Socket 与 NIO API 速查 | Socket、ServerSocket、Channel、Buffer、Selector 的常用方法 |
| B | 附录 B 网络诊断命令清单 | netstat、lsof、tcpdump、ab、jcmd 的可复制命令 |
三卷衔接
- 卷一(本书):只用 JDK,建立字节流、拆帧、事件循环与协议实现的底层直觉。
- 卷二《Netty 高性能网络编程》:把卷一手写的
EventLoop、Channel、ByteBuf、编解码器映射到 Netty 的组件与生产用法。 - 卷三《Java 服务端通信工程》:把这些能力放回服务端工程,讲 gRPC、服务发现、超时重试、可观测性与发布。
实验口径
- 所有「本机输出」来自 macOS 26.3、Apple M1 Pro、Temurin 25.0.5+8;换机器后绝对值会变。
- 没有实际执行的抓包、压测与性能数字,不写成实测;单次运行会明确标注。
- 代码以可编译为准,共享类型在篇首契约中固定;章节之间允许增量生长,不要求每节从零搭项目。