引言
在前文中我们介绍了连接就绪,读就绪,接受就绪三种事件流程的处理代码。这篇文章我们来介绍下最后一种流程,数据写出。当用户业务需要将数据写出时一般会调用 channel.write
或者是 channel.writeAndFlush
。相关的 API 在入门篇的例子中也有过演示。本文,我们将来分析这两个 API 背后的工作原理。
write 和 flush 的区别
在 Netty 的设计中,写出侧存在一个写出缓存。当我们调用 channel.write
或者 channelHandlerContext.write
时,其实只是将需要写出的内容放入到写出缓存的队列中。而只有调用 channel.flush
或者 channelHandlerContext.flush
才会让 Netty 将写出缓存中的数据真正写出到 Socket 的缓冲区从而通过 tcp 来发送。当然,Netty 也提供了方便的整合方法 writeAndFlush
用于将数据写出并且刷出到 socket 缓冲区。下面我们来分别分析下两个不同的方法。
数据写出 write
在 NioSocketChannel
的 write
方法实际上委托给 pipeline
来处理,是一个出站事件。经过管道中层层处理器对数据的转换,最终到达管道的首节点的 write
方法。而首节点的 write 方法再次将写出动作委托给 unsafe.write
。在 NioSocketChannel
中,unsafe 实例是 NioSocketChannelUnsafe
,其 write
方法继承自