★Netty 底层原理完整体系拓荒者闪电侠首本著作 ★通过一个 IM 的例子全面介绍 Netty 的使用,实战性较强 ★不同于其他书,本书门部分可一口气读完,一周内实战 ★同时涵盖大量的避坑范例,读者可直拿到生产环境使用 ★门部分每一部分都有对应底层原理介绍,知其然并知其所以然 ★不同于其他书,源码部分站在初学视角,读者可经历完整探索过程 ★作者经验丰富,长年专注于研究 Netty 在生产环境的使用及性能调优
售 价:¥
纸质售价:¥80.40购买纸书
温馨提示:数字商品不支持退换货,不提供源文件,不支持导出打印
为你推荐
内容简介
推荐语
推荐序
前言
上篇 入门实战
第1章 即时聊天系统简介
1.1 单聊流程
1.2 单聊的指令
1.2.1 指令图示
1.2.2 指令列表
1.3 群聊流程
1.4 群聊要实现的指令集
1.4.1 指令图示
1.4.2 指令列表
1.5 Netty
1.5.1 客户端使用Netty的程序逻辑结构
1.5.2 服务端使用Netty的程序逻辑结构
1.6 本书实现的即时聊天形式
第2章 Netty是什么
2.1 IO编程
2.2 NIO编程
2.2.1 线程资源受限
2.2.2 线程切换效率低下
2.2.3 IO读写面向流
2.3 Netty编程
第3章 Netty开发环境配置
3.1 Maven
3.1.1 下载
3.1.2 配置和验证
3.2 Git
3.2.1 下载与安装
3.2.2 配置
3.3 IntelliJ IDEA
第4章 服务端启动流程
4.1 服务端启动最小化代码
4.2 自动绑定递增端口
4.3 服务端启动的其他方法
4.3.1 handler()方法
4.3.2 attr()方法
4.3.3 childAttr()方法
4.3.4 option()方法
4.3.5 childOption()方法
4.4 总结
第5章 客户端启动流程
5.1 客户端启动Demo
5.2 失败重连
5.3 客户端启动的其他方法
5.3.1 attr()方法
5.3.2 option()方法
5.4 总结
5.5 思考
第6章 客户端与服务端双向通信
6.1 客户端发送数据到服务端
6.2 服务端读取客户端数据
6.3 服务端返回数据到客户端
6.4 总结
6.5 思考
第7章 数据载体ByteBuf的介绍
7.1 ByteBuf的结构
7.2 容量API
7.3 读写指针相关的API
7.4 读写API
7.5 实战
7.6 总结
7.7 思考
第8章 客户端与服务端通信协议编解码
8.1 什么是客户端与服务端的通信协议
8.2 通信协议的设计
8.3 通信协议的实现
8.3.1 Java对象
8.3.2 序列化
8.3.3 编码:封装成二进制数据的过程
8.3.4 解码:解析Java对象的过程
8.4 总结
8.5 思考
第9章 实现客户端登录
9.1 登录流程
9.2 逻辑处理器
9.3 客户端发送登录请求
9.3.1 客户端处理登录请求
9.3.2 服务端处理登录请求
9.4 服务端发送登录响应
9.4.1 服务端处理登录响应
9.4.2 客户端处理登录响应
9.5 总结
9.6 思考
第10章 实现客户端与服务端收发消息
10.1 收发消息对象
10.2 判断客户端是否登录成功
10.3 在控制台输入消息并发送
10.4 服务端收发消息处理
10.5 客户端收消息处理
10.6 总结
10.7 思考
第11章 Pipeline与ChannelHandler
11.1 Pipeline与ChannelHandler的构成
11.2 ChannelHandler的分类
11.3 ChannelInboundHandler的事件传播
11.4 ChannelOutboundHandler的事件传播
11.5 总结
11.6 思考
第12章 构建客户端与服务端的Pipeline
12.1 ChannelInboundHandlerAdapter与ChannelOutboundHandlerAdapter
12.2 ByteToMessageDecoder
12.3 SimpleChannelInboundHandler
12.4 MessageToByteEncoder
12.5 构建客户端与服务端的Pipeline
12.6 总结
12.7 思考
第13章 拆包/粘包理论与解决方案
13.1 拆包/粘包例子
13.2 为什么会有粘包、半包现象
13.3 拆包的原理
13.4 Netty自带的拆包器
13.4.1 固定长度的拆包器FixedLengthFrameDecoder
13.4.2 行拆包器LineBasedFrameDecoder
13.4.3 分隔符拆包器DelimiterBasedFrameDecoder
13.4.4 基于长度域的拆包器LengthFieldBasedFrameDecoder
13.5 如何使用LengthFieldBasedFrameDecoder
13.6 拒绝非本协议连接
13.7 客户端和服务端的Pipeline结构
13.8 总结
13.9 思考
第14章 ChannelHandler的生命周期
14.1 ChannelHandler的生命周期详解
14.2 ChannelHandler生命周期各回调方法的用法举例
14.2.1 ChannelInitializer的实现原理
14.2.2 handlerAdded()方法与handlerRemoved()方法
14.2.3 channelActive()方法与channelInActive()方法
14.2.4 channelRead()方法
14.2.5 channelReadComplete()方法
14.3 总结
14.4 思考
第15章 使用ChannelHandler的热插拔实现客户端身份校验
15.1 身份检验
15.2 移除校验逻辑
15.3 身份校验演示
15.3.1 有身份认证的演示
15.3.2 无身份认证的演示
15.4 总结
15.5 思考
第16章 客户端互聊的原理与实现
16.1 最终效果
16.2 一对一单聊的原理
16.3 一对一单聊的实现
16.3.1 用户登录状态与Channel的绑定
16.3.2 服务端接收消息并转发的实现
16.3.3 客户端接收消息的逻辑处理
16.3.4 客户端控制台登录和发送消息
16.4 总结
16.5 思考
第17章 群聊的发起与通知
17.1 最终效果
17.2 群聊的原理
17.3 控制台程序重构
17.3.1 创建控制台命令执行器
17.3.2 管理控制台命令执行器
17.4 创建群聊的实现
17.4.1 客户端发送创建群聊请求
17.4.2 服务端处理创建群聊请求
17.4.3 客户端处理创建群聊响应
17.5 总结
17.6 思考
第18章 群聊的成员管理
18.1 最终效果
18.2 群的加入
18.2.1 在控制台添加群加入命令处理器
18.2.2 服务端处理加群请求
18.2.3 客户端处理加群响应
18.3 群的退出
18.4 获取群成员列表
18.4.1 在控制台添加获取群成员列表命令处理器
18.4.2 服务端处理获取群成员列表请求
18.4.3 客户端处理获取群成员列表响应
18.5 总结
18.6 思考
第19章 群聊消息的收发及Netty性能优化
19.1 群聊消息的最终效果
19.2 群聊消息的收发实现
19.3 共享Handler
19.4 压缩Handler——合并编解码器
19.5 缩短事件传播路径
19.5.1 压缩Handler——合并平行Handler
19.5.2 更改事件传播源
19.6 减少阻塞主线程的操作
19.7 如何准确统计处理时长
19.8 总结
第20章 心跳与空闲检测
20.1 网络问题
20.2 服务端空闲检测
20.3 客户端定时发心跳数据包
20.4 服务端回复心跳与客户端空闲检测
20.5 总结
20.6 思考
下篇 源码分析
第21章 服务端启动流程解析
21.1 服务端启动示例
21.2 服务端启动的核心步骤
21.3 创建服务端Channel
21.3.1 创建JDK底层Channel
21.3.2 创建Channel配置类
21.3.3 设置Channel类型为非阻塞
21.3.4 创建Channel核心组件
21.3.5 创建服务端Channel小结
21.4 初始化服务端Channel
21.4.1 设置服务端Channel的Option与Attr
21.4.2 设置客户端Channel的Option与Attr
21.4.3 配置服务端启动逻辑
21.4.4 初始化服务端Channel小结
21.5 注册服务端Channel
21.5.1 调用JDK底层注册Selector
21.5.2 回调handlerAdded事件
21.5.3 传播channelRegistered事件
21.5.4 其他逻辑
21.5.5 注册服务端Channel小结
21.6 绑定服务端端口
21.6.1 调用JDK底层绑定端口
21.6.2 传播channelActive事件
21.6.3 注册ACCEPT事件
21.6.4 绑定服务端端口小结
21.7 总结
第22章 Reactor线程模型解析
22.1 NioEventLoopGroup的创建
22.1.1 确定NioEventLoop的个数
22.1.2 NioEventLoopGroup的创建总体框架
22.1.3 创建ThreadPerTaskExecutor
22.1.4 创建NioEventLoop
22.1.5 创建线程选择器
22.1.6 NioEventLoopGroup的创建小结
22.2 NioEventLoop对应线程的创建和启动
22.2.1 NioEventLoop的启动入口
22.2.2 创建线程并启动
22.3 NioEventLoop的执行流程
22.3.1 NioEventLoop的执行总体框架
22.3.2 执行一次事件轮询
22.3.3 处理产生IO事件的Channel
22.3.4 添加任务
22.3.5 执行任务
22.3.6 NioEventLoop 的执行流程小结
22.4 总结
第23章 客户端连接接入流程解析
23.1 新连接接入的总体流程
23.2 检测到有新连接
23.3 注册Reactor线程
23.3.1 创建NioSocketChannel
23.3.2 设置并绑定NioSocketChannel
23.3.3 注册 Reactor 线程小结
23.4 总结
第24章 解码原理解析
24.1 粘包与拆包
24.1.1 为什么要粘包
24.1.2 为什么要拆包
24.2 拆包的原理
24.3 Netty中拆包的基类
24.4 拆包抽象
24.4.1 累加数据
24.4.2 将累加的数据传递给业务进行拆包
24.4.3 清理字节容器
24.4.4 将业务数据包传递给业务解码器处理
24.5 行拆包器
24.5.1 找到换行符的位置
24.5.2 非discarding模式的处理
24.5.3 discarding模式的处理
24.6 特定分隔符拆包
24.7 LengthFieldBasedFrameDecoder进阶用法
24.7.1 基于长度的拆包
24.7.2 基于长度的截断拆包
24.7.3 基于偏移长度的拆包
24.7.4 基于可调整长度的拆包
24.7.5 基于偏移可调整长度的截断拆包
24.7.6 基于偏移可调整变异长度的截断拆包
24.8 LengthFieldBasedFrameDecoder源码剖析
24.8.1 构造函数
24.8.2 实现拆包抽象
24.9 总结
第25章 ChannelPipeline解析
25.1 ChannelPipeline的初始化
25.2 ChannelPipeline添加ChannelHandler
25.2.1 检查是否有重复的Handler
25.2.2 创建节点
25.2.3 添加节点
25.2.4 回调用户方法
25.2.5 ChannelPipeline添加ChannelHandler小结
25.3 ChannelPipeline删除ChannelHandler
25.3.1 找到待删除的节点
25.3.2 调整双向链表指针并删除
25.3.3 回调用户方法
25.3.4 ChannelPipeline删除ChannelHandler小结
25.4 Inbound事件的传播
25.4.1 Unsafe是什么
25.4.2 ChannelPipeline中的HeadContext
25.4.3 ChannelPipeline中的Inbound事件传播
25.4.4 ChannelPipeline中的TailContext
25.4.5 Inbound事件的传播小结
25.5 Outbound事件的传播
25.6 ChannelPipeline中异常的传播
25.6.1 Inbound异常的传播
25.6.2 Outbound异常的传播
25.7 总结
第26章 writeAndFlush解析
26.1 Pipeline中的标准链表结构
26.2 Java对象编码过程
26.3 write:写队列
26.4 flush:刷新写队列
26.4.1 获得第一个需要flush的节点的数据
26.4.2 获得自旋锁的迭代次数
26.4.3 采用自旋方式将ByteBuf写出JDK NIO的Channel
26.4.4 删除该节点
26.5 writeAndFlush:写队列并刷新
26.6 总结
第27章 本书总结
27.1 Netty是什么
27.2 服务端和客户端的启动
27.3 ByteBuf
27.4 自定义协议拆包与编解码
27.5 Handler与Pipeline
27.6 耗时操作的处理与统计
27.7 最后的话
买过这本书的人还买过
读了这本书的人还在读
同类图书排行榜