解码器:
在进入decode方法处理完业务逻辑后,如果当前缓冲区所有数据已经读完(ridx=widx),会自动释放当前信道字节缓冲区中已读取的部分.
和write有关的方法:
write和writeAndFlush调用底层AbstractChannel的内部类AbstractUnsafe的write方法.
在该方法中会调用filterOutboundMessage方法对write的数据进行类型判断,只有ByteBuf类型
和FileRegion类型的才认为是有效数据,并将改数据返回.否则抛出一个异常(UnsupportedOperationException).
如果是数据类型正确,返回了数据,那么会将数据加入outboundBuffer,(当调用flush时会冲刷outboundBuffer将数据写出).
如果数据类型不正确,抛出了异常,那么会将数据释放(release)并return;
同一个Bytebuf对象不能被write多次,因为在调用write时outboundBuffer保存该对象的引用,等到调用flush时,每当成功写出一个对象,都会释放该对象,如果一个对象被write了多次,那么flush时,该对象第一次被写出后就会释放(ChannelOutboundBuffer.remove()),后面的引用再去写出时就会发生异常.
调用flush底层会调用AbstractChannel.doWrite(ChannelOutboundBuffer in) ;-->ChannelOutboundBuffer.removeBytes(long writtenBytes);-->ChannelOutboundBuffer.remove();-->ReferenceCountUtil.safeRelease(msg);
(完)