吃透Netty源码系列五十九之AbstractUnsafe和AbstractNioUnsafe

本文深入剖析Netty中的AbstractUnsafe和AbstractNioUnsafe类,详细解读beginRead、write、flush等核心方法的实现原理,以及NioUnsafe接口的使用,为理解Netty的I/O操作提供关键洞察。

AbstractUnsafe的方法

beginRead开始读

判断下条件,准备开始读,真正读的是通道的doBeginRead方法。

 @Override
        public final void beginRead() {
   
   
            assertEventLoop();

            if (!isActive()) {
   
   
                return;
            }

            try {
   
   
                doBeginRead();
            } catch (final Exception e) {
   
   
                invokeLater(new Runnable() {
   
   
                    @Override
                    public void run() {
   
   
                        pipeline.fireExceptionCaught(e);
                    }
                });
                close(voidPromise());
            }
        }

write写数据到出站缓冲区

这个以前讲过,就是write操作最后就是写入出站缓冲区。如果出站缓冲区关闭了,那就无用写了,释放消息即可,否则就封装后放入出站缓冲区里,里面是个单链表。

 @Override
        public final void write(Object msg, ChannelPromise promise) {
   
   
            assertEventLoop();
            ChannelOutboundBuffer outboundBuffer = this.outboundBuffer;
            if (outboundBuffer == null) {
   
   
                ReferenceCountUtil.release(msg);
                return;
            }

            int size;
            try {
   
   
                msg = filterOutboundMessage(msg);//封装成直接缓冲区
                size = pipeline.estimatorHandle().size(msg);//获取缓冲区大小
                if (size < 0) {
   
   
                    size = 0;
                }
            } catch (Throwable t) {
   
   
                safeSetFailure(promise, t);
                ReferenceCountUtil.release(msg);
                return;
            }

            outboundBuffer.addMessage(msg, size, promise);//往出站缓冲区添加消息
        }

flush准备将出站缓冲区数据发出去

给出站缓冲区数据打好冲刷标记,然后准备冲刷flush0

  @Override
        public final void flush() {
   
   
            assertEventLoop();

            ChannelOutboundBuffer outboundBuffer = this.outboundBuffer;
            if (outboundBuffer == null) {
   
   
                return;
            }

            outboundBuffer.addFlush();
            flush0();
        }

flush0将出站缓冲区数据发出去

具体的发送方法,主要是调用通道的doWrite方法,里面才是将数据从通道中发出去。

  protected void flush0() {
   
   
            if (inFlush0) {
   
   //避免重入
 
                return;
            }

            final ChannelOutboundBuffer outboundBuffer = this.outboundBuffer;
            if (outboundBuffer == null || outboundBuffer.isEmpty()) {
   
   
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值