Netty源码解读(9)-粘包/拆包问题

This entry is part 9 of 9 in the series Netty源码解读

对象修饰 MessageToMessageEncoder/MessageToMessageDecoder ByteBuf粘包发送 LengthFieldPrepender见Netty源码解读(6)-数据发送 ByteBuf拆包 LengthFieldBasedFrameDecoder ByteBuf解析对象 ByteBuf#readInt(int)ByteBuf#readLong(long)Byt …

Netty源码解读(8)-关闭服务

This entry is part 8 of 9 in the series Netty源码解读

Netty服务的关闭涉及以下几种资源: 线程 EventLoopGroup线程池 EventLoop线程 连接 EventLoop管理下的所有Channel Selector 内存 Channel下的各种缓存资源 线程的关闭 EventLoopGroup 关闭是从EventLoopGroup调用shutdown相关方法开始的,优雅关闭的方法为: 之所以称之为优雅,是此方要求关闭前必须满足在静默时间 …

Netty源码解读(7)-断开连接

This entry is part 7 of 9 in the series Netty源码解读

Netty连接的断开本质上是channel的断开,更具体的(nio)ServerSocketChannel和(nio)SocketChannel的断开,这在jdk的api中定义了方法AbstractInterruptibleChannel#close()。这是netty对一个连接的处理的结束。在执行关闭之前,还需要保证对资源的有序释放,这些资源包括: 主动断开 主动的断开连接是一个出站事件,clo …

Netty源码解读(6)-数据发送

This entry is part 6 of 9 in the series Netty源码解读

netty发送数据使用的接口方法是ChannelOutboundInvoker#write(),它共有三个主要的实现方案: 即可以在Channel, HandlerContext, Pipeline三个级别实行发送。但发送逻辑只有两种类型: 从Pipeline的TailContext开始发送,即不会触发链上的下游的出站Handler的write()方法 (方案1和方案3) 从当前HandlerCo …

Netty源码解读(5)-数据处理(Handler调用链)

This entry is part 5 of 9 in the series Netty源码解读

上一章介绍了Netty如何基于ByteBuf从channel中读取数据: 每次读取完成之后可以得到一个填充了业务数据的ByteBuf,并作为参数调用pipeline#fireChannelRead(ByteBuf)方法 读取完成之后(可能是数据读完/或者达到连续读的最大值控制/或者连接断开导致)会触发一次pipeline#fireChannelReadComplete()方法 Pipeline是N …

Netty源码解读(4)-数据接收(ByteBuf填充)

This entry is part 4 of 9 in the series Netty源码解读

本文讨论Netty数据接收的过程,分为两部分进行:1. 数据接收的缓存结构; 2. 数据写入缓存的过程。 先讨论第一部分,数据的缓存结构。缓存是在处理速率不同的多种设备间共享数据常用的手段,NIO中就提供了用于缓存数据的ByteBuffer。而Netty的设计者认为nioByteBuffer的实现不够好,所以重新实现了一个ByteBuf用于缓存数据。那么,这两者有什么差异?使用上有什么不同? ni …

Netty源码解读(3)–构建连接

This entry is part 3 of 9 in the series Netty源码解读

本文开始真正地对源码进行分析,使用的demo代码还是前文提到的EchoServer。 Reactor线程模型 Reactor线程模型是常见的,用于解决事件-响应场景问题的设计。按照Doug Lea在《Scalable IO in Java》中的描述,Reactor线程模型的核心思想是分治,把大的问题(端对端的网络通信)分为一系列的小问题来解决。Netty也采用了Reactor线程模型来处理IO事件 …