《Netty权威指南》目录

Netty权威指南》是全球第二本、中国第一本Netty教材,它由华为平台中间件资深架构设计师李林锋撰写,作者有6年多的NIO设计和开发实战经验,多次受邀进行Netty和
NIO编程培训。

本书基于最新的Netty5.0 版本撰写,从Netty开发环境的搭建,到第一个基于Netty的NIO服务端和客户端程序的开发,一步步的让读者从入门到精通,熟练的掌握基于Netty
的NIO开发,理解Netty的架构设计原理,可以对Netty进行深度的定制设计和开发。

本书共分为五部分:
第一部分介绍 JAVA NIO的入门知识,包括 Java NIO的演进和NIO编程入门。
第二部分是Netty入门,包括Netty开发环境的搭建、第一个服务端和客户端的开发与调试。
第三部分对Netty的编解码模块进行了详细介绍,包括编解码的基础知识、Java序列化、Google ProtoBuf和Jboss Marshalling序列化框架的应用;
第四部分是Netty多协议开发,详细介绍了基于Netty的HTTP协议、WebSocket协议、UDP协议和文件传输的设计和开发,最后讲解了如何利用Netty进行私有协议栈的设计和开发。

第五部分对Netty的主要类库源码进行了分析,包括ByteBuf和Unsafe、ChannelPipeline和ChannelHandler、EventLoop和EventLoopGroup、Future和Promise。
第六部分介绍了Netty的高级应用,包括Java多线程编程在Netty中的应用、Netty的架构剖析、Netty在互联网行业的应用、Netty在大数据领域的应用,最后是Netty的未来展望。
附录包含了Netty的启动参数配置列表。

下面是本书的目录:

Netty权威指南…………………………………………………………………………………………………. 1

第 1章 Java的IO演进之路……………………………………………………………………………… 10

1.1. IO基础入门……………………………………………………………………………………… 11

1.1.1. Linux网络IO模型简介…………………………………………………………….. 11

1.1.2. IO多路复用技术……………………………………………………………………… 14

1.2. Java的IO演进…………………………………………………………………………………. 15

1.2.1. Java的IO发展简史…………………………………………………………………. 15

1.3. 总结………………………………………………………………………………………………… 16

第 2 章NIO入门…………………………………………………………………………………………… 17

2.1. 传统的BIO编程……………………………………………………………………………….. 18

2.1.1. BIO通信模型图……………………………………………………………………….. 18

2.1.2. 同步阻塞式IO创建的TimeServer源码分析………………………………… 18

2.1.3. 同步阻塞式IO创建的TimeClient源码分析………………………………… 22

2.2. 伪异步IO编程…………………………………………………………………………………. 24

2.2.1. 伪异步IO模型图…………………………………………………………………….. 25

2.2.2. 伪异步式IO创建的TimeServer源码分析……………………………………. 25

2.2.3. 伪异步IO弊端分析………………………………………………………………….. 28

2.3. NIO编程…………………………………………………………………………………………. 30

2.3.1. NIO类库简介…………………………………………………………………………… 31

2.3.2. NIO服务端序列图……………………………………………………………………. 34

2.3.3. NIO创建的TimeServer源码分析……………………………………………….. 36

2.3.4. NIO客户端序列图……………………………………………………………………. 42

2.3.5. NIO创建的TimeClient源码分析……………………………………………….. 45

2.4. AIO编程…………………………………………………………………………………………. 51

2.4.1. AIO 创建的TimeServer源码分析………………………………………………. 51

2.4.2. AIO创建的TimeClient源码分析……………………………………………….. 57

2.4.3. AIO版本时间服务器运行结果……………………………………………………. 62

2.5. 4种IO的对比………………………………………………………………………………….. 64

2.5.1. 概念澄清………………………………………………………………………………… 64

2.5.2. 不同IO模型对比…………………………………………………………………….. 65

2.6. 选择Netty的理由……………………………………………………………………………… 66

2.6.1. 不选择JAVA原生NIO编程的原因………………………………………………. 66

2.6.2. 为什么选择Netty……………………………………………………………………. 68

2.7. 总结………………………………………………………………………………………………… 68

第 3 章Netty入门应用…………………………………………………………………………………… 70

3.1. Netty开发环境的搭建……………………………………………………………………….. 71

3.1.1. 下载Netty的软件包………………………………………………………………… 71

3.1.2. 搭建Netty应用工程………………………………………………………………… 72

3.2. Netty服务端开发………………………………………………………………………………. 73

3.2.1. TimeServer开发……………………………………………………………………… 73

3.3. Netty客户端开发………………………………………………………………………………. 77

3.3.1. TimeClient开发……………………………………………………………………… 77

3.4. 运行和调试………………………………………………………………………………………. 81

3.4.1. 服务端和客户端的运行…………………………………………………………….. 81

3.4.2. 打包和部署…………………………………………………………………………….. 82

3.5. 总结………………………………………………………………………………………………… 82

第 4 章TCP粘包/拆包问题的解决之道…………………………………………………………….. 83

4.1. TCP粘包/拆包………………………………………………………………………………….. 84

4.1.1. TCP粘包/拆包问题说明……………………………………………………………. 84

4.1.2. TCP粘包/拆包发生的原因…………………………………………………………. 85

4.1.3. 粘包问题的解决策略………………………………………………………………… 85

4.2. 未考虑TCP粘包导致功能异常的案例………………………………………………….. 86

4.2.1. TimeServer的改造…………………………………………………………………… 86

4.2.2. TimeClient的改造…………………………………………………………………… 87

4.2.3. 运行结果………………………………………………………………………………… 89

4.3. 利用LineBasedFrameDecoder解决TCP粘包问题…………………………………… 91

4.3.1. 支持TCP粘包的TimeServer……………………………………………………… 92

4.3.2. 支持TCP粘包的TimeClient……………………………………………………… 95

4.3.3. 运行支持TCP粘包的时间服务器程序………………………………………….. 98

4.3.4. LineBasedFrameDecoder和StringDecoder的原理分析……………….. 103

4.4. 总结………………………………………………………………………………………………. 103

第 5 章分隔符和定长解码器的应用……………………………………………………………….. 104

5.1. DelimiterBasedFrameDecoder应用开发……………………………………………….. 105

5.1.1. DelimiterBasedFrameDecoder服务端开发…………………………………. 105

5.1.2. DelimiterBasedFrameDecoder客户端开发…………………………………. 108

5.1.3. 运行DelimiterBasedFrameDecoder服务端和客户端程序……………… 111

5.2. FixedLengthFrameDecoder应用开发…………………………………………………… 112

5.2.1. FixedLengthFrameDecoder服务端开发……………………………………… 112

5.2.2. 利用telnet命令行测试EchoServer服务端……………………………….. 115

5.3. 总结………………………………………………………………………………………………. 116

第 6 章编解码介绍………………………………………………………………………………………. 118

6.1. Java序列化的缺点…………………………………………………………………………… 119

6.1.1. 无法跨语言……………………………………………………………………………. 119

6.1.2. 序列化后的码流太大………………………………………………………………. 119

6.1.3. 序列化性能太低…………………………………………………………………….. 122

6.2. 业界主流的编解码框架简介………………………………………………………………. 125

6.2.1. Google的Protobuf介绍…………………………………………………………. 125

6.2.2. FaceBook的Thrift介绍…………………………………………………………. 127

6.2.3. Jboss Marshalling介绍…………………………………………………………. 128

6.3. 总结………………………………………………………………………………………………. 128

第 7 章Java序列化………………………………………………………………………………………. 129

7.1. Netty Java序列化服务端开发…………………………………………………………….. 130

7.1.1. 服务端开发例程…………………………………………………………………….. 130

7.2. Java序列化Netty客户端开发……………………………………………………………. 138

7.2.1. 客户端开发例程…………………………………………………………………….. 139

7.3. 运行结果………………………………………………………………………………………… 142

7.3.1. 运行Java序列化例程…………………………………………………………….. 142

7.4. 总结………………………………………………………………………………………………. 144

第 8 章Google Protobuf编解码……………………………………………………………………… 145

8.1. Protobuf的入门………………………………………………………………………………. 146

8.1.1. Protobuf开发环境搭建…………………………………………………………… 146

8.1.2. Protobuf编解码开发……………………………………………………………… 149

8.1.3. 运行Protobuf例程………………………………………………………………… 150

8.2. Netty的Protobuf服务端开发…………………………………………………………….. 151

8.2.1. Protobuf版本的图书订购服务端开发……………………………………….. 151

8.2.2. Protobuf版本的图书订购客户端开发……………………………………….. 154

8.2.3. Protobuf版本的图书订购程序功能测试……………………………………. 158

8.3. Protobuf的使用注意事项………………………………………………………………….. 161

8.4. 总结………………………………………………………………………………………………. 162

第 9 章Jboss Marshalling 编解码…………………………………………………………………… 163

9.1. Marshalling开发环境准备…………………………………………………………………. 163

9.2. Netty的Marshalling服务端开发………………………………………………………… 164

9.2.1. 服务端开发示例…………………………………………………………………….. 164

9.3. Netty的Marshalling客户端开发………………………………………………………… 167

9.3.1. 客户端开发示例…………………………………………………………………….. 167

9.4. 运行Marshalling客户端和服务端例程………………………………………………… 169

9.5. 总结………………………………………………………………………………………………. 171

第 10 章HTTP协议开发应用………………………………………………………………………… 173

10.1. HTTP协议介绍……………………………………………………………………………… 174

10.1.1. HTTP协议的URL……………………………………………………………………. 174

10.1.2. HTTP请求消息(HttpRequest)……………………………………………… 174

10.1.3. HTTP请求响应消息(HttpResponse)……………………………………… 177

10.2. Netty HTTP服务端入门开发……………………………………………………………. 178

10.2.1. HTTP服务端例程场景描述……………………………………………………… 179

10.2.2. HTTP服务端开发…………………………………………………………………… 179

10.2.3. Netty HTTP文件服务器例程运行结果……………………………………… 189

10.3. Netty HTTP+XML协议栈开发…………………………………………………………. 194

10.3.1. 开发场景介绍………………………………………………………………………. 195

10.3.2. HTTP+XML协议栈设计……………………………………………………………. 198

10.3.3. 高效的XML绑定框架JiBx……………………………………………………… 199

10.3.4. HTTP+XML编解码框架开发……………………………………………………… 209

10.3.5. HTTP+XML协议栈测试……………………………………………………………. 229

10.3.6. 小结…………………………………………………………………………………… 231

10.4. 总结…………………………………………………………………………………………….. 231

第 11 章WebSocket 协议开发应用…………………………………………………………………. 232

11.1. HTTP协议的弊端………………………………………………………………………….. 233

11.2. WebSocket入门……………………………………………………………………………… 233

11.2.1. WebSocket背景……………………………………………………………………. 234

11.2.2. WebSocket连接建立……………………………………………………………… 234

11.2.3. WebSocket生命周期……………………………………………………………… 236

11.2.4. WebSocket连接关闭……………………………………………………………… 236

11.3. Netty WebSocket应用开发………………………………………………………………. 237

11.3.1. WebSocket服务端功能介绍……………………………………………………. 237

11.3.2. WebSocket服务端开发…………………………………………………………… 239

11.3.3. 运行WebSocket服务端………………………………………………………….. 246

11.4. 总结…………………………………………………………………………………………….. 247

第 12 章UDP协议开发应用………………………………………………………………………….. 249

12.1. UDP协议简介……………………………………………………………………………….. 250

12.2. UDP服务端开发……………………………………………………………………………. 251

12.3. UDP客户端开发……………………………………………………………………………. 253

12.4. 运行UDP流程………………………………………………………………………………. 255

12.5. 总结…………………………………………………………………………………………….. 256

第 13 章文件传输……………………………………………………………………………………….. 257

13.1. 文件的基础知识…………………………………………………………………………….. 258

13.1.1. 文件的概念………………………………………………………………………….. 258

13.1.2. 文件路径…………………………………………………………………………….. 258

13.1.3. 文件名称…………………………………………………………………………….. 258

13.1.4. FileChannel简介…………………………………………………………………. 259

13.2. Netty文件传输开发……………………………………………………………………….. 260

13.3. 运行Netty文件传输服务例程………………………………………………………….. 263

13.4. 总结…………………………………………………………………………………………….. 264

第 14 章私有协议栈开发………………………………………………………………………………. 266

14.1. 私有协议介绍………………………………………………………………………………… 267

14.2. Netty协议栈功能设计…………………………………………………………………….. 267

14.2.1. 网络拓扑图………………………………………………………………………….. 268

14.2.2. 协议栈功能描述…………………………………………………………………… 268

14.2.3. 通信模型…………………………………………………………………………….. 269

14.2.4. 消息定义…………………………………………………………………………….. 270

14.2.5. Netty协议支持的字段类型……………………………………………………. 271

14.2.6. Netty协议的编解码规范……………………………………………………….. 271

14.2.7. 链路的建立………………………………………………………………………….. 273

14.2.8. 链路的关闭………………………………………………………………………….. 274

14.2.9. 可靠性设计………………………………………………………………………….. 274

14.2.10. 安全性设计………………………………………………………………………… 276

14.2.11. 可扩展性设计…………………………………………………………………….. 276

14.3. Netty协议栈开发…………………………………………………………………………… 277

14.3.1. 数据结构定义………………………………………………………………………. 277

14.3.2. 消息编解码………………………………………………………………………….. 280

14.3.3. 握手和安全认证…………………………………………………………………… 285

14.3.4. 心跳检测机制………………………………………………………………………. 289

14.3.5. 断连重连…………………………………………………………………………….. 292

14.3.6. 客户端代码………………………………………………………………………….. 292

14.3.7. 服务端代码………………………………………………………………………….. 294

14.4. 运行协议栈…………………………………………………………………………………… 295

14.4.1. 正常场景…………………………………………………………………………….. 295

14.4.2. 异常场景:服务端宕机重启…………………………………………………… 296

14.4.3. 异常场景:客户端宕机重启…………………………………………………… 299

14.5. 总结…………………………………………………………………………………………….. 300

第 15 章ByteBuf 和相关辅助类…………………………………………………………………… 302

15.1. ByteBuf 功能说明…………………………………………………………………………. 303

15.1.1. ByteBuf的工作原理……………………………………………………………… 304

15.1.2. ByteBuf的功能介绍……………………………………………………………… 308

15.2. ByteBuf源码分析………………………………………………………………………….. 323

15.2.1. ByteBuf的主要类继承关系……………………………………………………. 323

15.2.2. AbstractByteBuf源码分析……………………………………………………. 324

15.2.3. AbstractReferenceCountedByteBuf源码分析…………………………… 333

15.2.4. UnpooledHeapByteBuf源码分析……………………………………………… 335

15.2.5. PooledByteBuf内存池原理分析……………………………………………… 340

15.2.6. PooledDirectByteBuf源码分析……………………………………………… 343

15.3. ByteBuf相关的辅助类功能介绍……………………………………………………….. 345

15.3.1. ByteBufHolder…………………………………………………………………….. 345

15.3.2. ByteBufAllocator………………………………………………………………… 346

15.3.3. CompositeByteBuf………………………………………………………………… 347

15.3.4. ByteBufUtil………………………………………………………………………… 349

15.4. 总结…………………………………………………………………………………………….. 350

第 16 章Channel 和 Unsafe………………………………………………………………………….. 351

16.1. Channel 功能说明…………………………………………………………………………. 352

16.1.1. Channel的工作原理……………………………………………………………… 352

16.1.2. Channel的功能介绍……………………………………………………………… 352

16.2. Channel源码分析………………………………………………………………………….. 355

16.2.1. Channel的主要继承关系图……………………………………………………. 356

16.2.2. AbstractChannel源码分析……………………………………………………. 357

16.2.3. AbstractNioChannel源码分析……………………………………………….. 359

16.2.4. AbstractNioByteChannel源码分析…………………………………………. 362

16.2.5. AbstractNioMessageChannel源码分析……………………………………. 365

16.2.6. AbstractNioMessageServerChannel源码分析…………………………… 367

16.2.7. NioServerSocketChannel源码分析…………………………………………. 367

16.2.8. NioSocketChannel源码分析…………………………………………………… 370

16.3. Unsafe功能说明…………………………………………………………………………….. 375

16.4. Unsafe源码分析…………………………………………………………………………….. 376

16.4.1. Unsafe继承关系类图……………………………………………………………. 376

16.4.2. AbstractUnsafe源码分析……………………………………………………… 377

16.4.3. AbstractNioUnsafe源码分析…………………………………………………. 386

16.4.4. NioByteUnsafe源码分析……………………………………………………….. 389

16.5. 总结…………………………………………………………………………………………….. 396

第 17 章ChannelPipeline和ChannelHandler…………………………………………………….. 397

17.1. ChannelPipeline功能说明……………………………………………………………….. 398

17.1.1. ChannelPipeline的事件处理…………………………………………………. 398

17.1.2. 自定义拦截器………………………………………………………………………. 400

17.1.3. 构建pipeline……………………………………………………………………… 401

17.1.4. ChannelPipeline的主要特性…………………………………………………. 401

17.2. ChannelPipeline源码分析……………………………………………………………….. 402

17.2.1. ChannelPipeline的类继承关系图…………………………………………… 402

17.2.2. ChannelPipeline对ChannelHandler的管理…………………………….. 402

17.2.3. ChannelPipeline的inbound事件…………………………………………… 405

17.2.4. ChannelPipeline的outbound事件…………………………………………. 406

17.3. ChannelHandler功能说明………………………………………………………………… 407

17.3.1. ChannelHandlerAdapter功能说明…………………………………………… 407

17.3.2. ByteToMessageDecoder功能说明……………………………………………. 408

17.3.3. MessageToMessageDecoder功能说明……………………………………….. 408

17.3.4. LengthFieldBasedFrameDecoder功能说明……………………………….. 409

17.3.5. MessageToByteEncoder功能说明……………………………………………. 412

17.3.6. MessageToMessageEncoder功能说明……………………………………….. 413

17.3.7. LengthFieldPrepender功能说明……………………………………………. 413

17.4. ChannelHandler源码分析………………………………………………………………… 414

17.4.1. ChannelHandler的类继承关系图……………………………………………. 414

17.4.2. ByteToMessageDecoder源码分析……………………………………………. 415

17.4.3. MessageToMessageDecoder源码分析……………………………………….. 418

17.4.4. LengthFieldBasedFrameDecoder源码分析……………………………….. 419

17.4.5. MessageToByteEncoder源码分析……………………………………………. 424

17.4.6. MessageToMessageEncoder源码分析……………………………………….. 424

17.4.7. LengthFieldPrepender源码分析……………………………………………. 426

17.5. 总结…………………………………………………………………………………………….. 427

第 18 章EventLoop和 EventLoopGroup…………………………………………………………. 428

18.1. Netty的线程模型…………………………………………………………………………… 429

18.1.1. Reactor单线程模型……………………………………………………………… 429

18.1.2. Reactor多线程模型……………………………………………………………… 430

18.1.3. 主从Reactor多线程模型………………………………………………………. 431

18.1.4. Netty的线程模型…………………………………………………………………. 432

18.1.5. 最佳实践…………………………………………………………………………….. 433

18.2. NioEventLoop源码分析………………………………………………………………….. 434

18.2.1. NioEventLoop设计原理…………………………………………………………. 434

18.2.2. NioEventLoop继承关系类图…………………………………………………… 435

18.2.3. NioEventLoop………………………………………………………………………. 435

18.3. 总结…………………………………………………………………………………………….. 445

第 19 章Future和 Promise……………………………………………………………………………. 446

19.1. Future功能…………………………………………………………………………………… 447

19.1.1. ChannelFuture功能介绍……………………………………………………….. 447

19.2. ChannelFuture源码分析…………………………………………………………………. 451

19.2.1. AbstractFuture…………………………………………………………………… 452

19.3. Promise功能介绍…………………………………………………………………………… 453

19.4. Promise 源码分析………………………………………………………………………….. 455

19.4.1. Promise继承关系图……………………………………………………………… 455

19.4.2. DefaultPromise…………………………………………………………………… 456

19.5. 总结…………………………………………………………………………………………….. 458

第 20 章Java多线程编程在Netty中的应用……………………………………………………… 460

20.1. JAVA内存模型与多线程编程…………………………………………………………… 461

20.1.1. 硬件的发展和多任务处理………………………………………………………. 461

20.1.2. JAVA内存模型……………………………………………………………………… 461

20.2. Netty的并发编程实践…………………………………………………………………….. 463

20.2.1. 对共享的可变数据进行正确的同步………………………………………….. 463

20.2.2. 正确的使用锁………………………………………………………………………. 464

20.2.3. volatile的正确使用……………………………………………………………. 465

20.2.4. CAS指令和原子类…………………………………………………………………. 468

20.2.5. 线程安全类的应用………………………………………………………………… 470

20.2.6. 读写锁的应用………………………………………………………………………. 473

20.2.7. 线程安全性文档说明…………………………………………………………….. 475

20.2.8. 不要依赖线程优先级…………………………………………………………….. 475

20.3. 总结…………………………………………………………………………………………….. 476

第 21 章Netty的架构剖析…………………………………………………………………………….. 477

21.1. Netty逻辑架构………………………………………………………………………………. 478

21.1.1. Reactor通信调度层……………………………………………………………… 478

21.1.2. 职责链ChannelPipeline……………………………………………………….. 478

21.1.3. 业务逻辑编排层(Service ChannelHandler)………………………….. 479

21.2. 关键架构质量属性…………………………………………………………………………. 479

21.2.1. 高性能………………………………………………………………………………… 479

21.2.2. 可靠性………………………………………………………………………………… 482

21.2.3. 可定制性…………………………………………………………………………….. 485

21.2.4. 可扩展性…………………………………………………………………………….. 485

21.3. 总结…………………………………………………………………………………………….. 486

第 22 章Netty的行业应用…………………………………………………………………………….. 487

22.1. Netty在互联网行业的应用………………………………………………………………. 488

22.1.1. 传统垂直架构面临的问题………………………………………………………. 488

22.1.2. 阿里分布式服务框架Dubbo……………………………………………………. 488

22.1.3. Dubbo的架构介绍…………………………………………………………………. 489

22.1.4. Netty在Dubbo中的应用……………………………………………………….. 492

22.1.5. Dubbo框架集成Netty源码分析……………………………………………… 494

22.2. Netty在大数据领域的应用………………………………………………………………. 498

22.3. Netty在游戏行业的应用…………………………………………………………………. 499

22.3.1. 游戏服务端架构介绍…………………………………………………………….. 499

22.3.2. Netty在游戏服务端的应用……………………………………………………. 503

22.4. 总结…………………………………………………………………………………………….. 504

第 23 章Netty未来展望……………………………………………………………………………….. 505

23.1. 应用范围………………………………………………………………………………………. 506

23.2. 技术演进………………………………………………………………………………………. 506

23.3. 社区活跃度…………………………………………………………………………………… 506

23.4. Road Map……………………………………………………………………………………… 506

23.5. 总结…………………………………………………………………………………………….. 507

附录 A  Netty 参数配置表…………………………………………………………………………….. 508

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 《Netty权威指南》目录



李 林锋

《Netty权威指南》作者,高级架构师。
FavoriteLoading添加本文到我的收藏
  • Trackback are closed
  • Comments (14)
    • Ryan
    • 05/18. 2014 12:15pm

    期待这本书能够出现在图灵社区,有电子版一同发售~

      • fair_jm
      • 05/25. 2014 11:46pm

      同期待…但出版社是机械工业出版社的话…如果有电子版也很大可能会发在kindle…

    • sunninghia
    • 05/21. 2014 4:48pm

    现在书出来了吗?

    • Rolinbor
    • 05/22. 2014 7:40pm

    书出来了没有?给一个目录有什么用?能提供购买方式吗?或者共享一个pdf版本也好。一睹为快。

    • zhaoloon
    • 05/24. 2014 10:37am

    微博上不是说最近会出来吗? 亚马逊上还是搜不到

    • 还没出版,请耐心等候。

        • 袁崇焕
        • 05/25. 2014 3:26pm

        到底什么时候能出啊?等这本书等的好心痛,等不能给个大概日期?很久之前就说5月能出,结果貌似要跳票了。

    • rjava
    • 06/05. 2014 4:23pm

    请问作者,这本书有同步的电子版发售吗?

    • Anonymous
    • 07/02. 2014 10:03am

    质量到底如何?豆瓣上评论说不咋地呀?

    • Anonymous
    • 07/04. 2014 5:01pm

    我能说这本书很垃圾么?
    结果打印两张纸 全是一句话 就后面的数字变了下。
    写书的咋这么不讲究。
    权威指南,呵呵,你跟专家教授是亲戚么?

    • 第一:本站也是为了造福读者,向大家免费发布此书的样章。发布样章时此书还未出版,我们也没有看过。
      第二:至于书中打印了两张纸,的确欠妥。但是也不能因为2张纸否定整本书。

    • Anonymous
    • 07/14. 2014 7:25pm

    辛苦并发网的各位啦,也是为了让大家更好的学习。不过感觉作者确实有点凑字数的嫌疑,为了写而写,算不上好书。一般,甚至感觉略差。

You must be logged in to post a comment.

return top