Netty写入过程中的一些问题

本文探讨了Netty在写入数据时ChannelFuture完成通知的时机,指出调用flush方法时,数据才会真正写入Java通道,并在内核发送缓冲区完成复制。然而,数据实际发送到网卡依赖于内核线程,可能存在丢失风险。同时,讨论了发送缓冲区的特性,说明在BIO和NIO模式下数据写入的不同行为。
摘要由CSDN通过智能技术生成
ChannelFuture什么时候发出完成的通知?

Netty写入数据的时候,最终会调用Unsafe的方法的write方法,unsafe写入的数据的时候,会把msg包装成一个Entry放到ChannelOutboundBuffer当中,Entry的结构是

    static final class Entry {
        private static final Recycler<Entry> RECYCLER = new Recycler<Entry>() {
            @Override
            protected Entry newObject(Handle handle) {
                return new Entry(handle);
            }
        };

        private final Handle handle;
        Entry next;
        Object msg;
        ByteBuffer[] bufs;
        ByteBuffer buf;
        ChannelPromise promise;
        long progress;
        long total;
        int pendingSize;
        int count = -1;
        boolean cancelled;
        }

Entry是通过一个对象池来管理,默认最大数量是32K,创建的时候从对象池中获取,关于对象池这里不做赘述。
写入ChannelOutBoundBuffer的时候是把msg包装成为Entry并添加到链表当中,调用write方法并不会让数据真正写到网卡,只是把数据写入到buffer中,而且此时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值