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事件 …

Netty源码解读(2)–工作流程

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

在nio的SelectionKey类中,有且仅有四种事件类型:OP_READ,OP_WRITE,OP_CONNECT,OP_ACCEPT。其中OP_ACCEPT表示ServerSocketChannel(服务端)接收到一个新的连接请求,在SocketChannel(客户端)中无此事件;OP_CONNECT表示SocketChannel(客户端)发起的连接请求已被对端节点处理,OP_READ, OP …

Netty源码解读(1)-概念 & 原理

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

Netty是Line公司的Trustin Lee(韩国)在2004年研发的Java网络应用程序框架。在进入Netty内容之前先得介绍Java网络通信的背景知识。这部分内容一带而过,阅读系列文章的你,应该通过别的渠道对基于Java基础库的网络编程有基础的了解。 BIO & NIO & AIO BIO / NIO / AIO 分别代表 Block I/O, Non-Blocking I …