• 防腐基
    2022-12-18 来自湖北
    讲的不够通俗易懂

    作者回复: 你好,能否帮忙提提具体意见不,让我知道你具体的疑惑的点。弱弱的说一句,我们真有“缘”呀,你在我生日那天提的问题,我的个人微信dingwpmz,期待我们能够再细细交流。

    
    
  • Geek_1cd0c8
    2023-03-24 来自天津
    问题:将数据写入网络最终通过socket的read,write接口吧,为什么还需要注册读写事件和开辟不属于socket的读写缓存 作者回复: 首先需要明确的是,通过Socket的write方法写入数据,并不需要注册写事件,那在什么时候需要注册写事件呢? 是在通过调用 SocketChannel的write方法,返回写入的字节数为0,但应用程序本次数据并未全部写入到通道中,这个是需要注册写事件,等待底层网络通知应用程序,该通道可以继续再写入,应用程序的事件选择器将会再次选择该通道,让应用程序可以继续写入 那在什么时候会出现写入的字节数为0呢,这个是与tcp的通信与拥塞控制有关,因为我们知道,tcp传输是 可靠传输,发送端将数据发送给接受端,如果接受端接受后,会通过ack机制告知发送端数据已接收,那发送端就可以把这些数据从底层的缓存区中删除,相反,如果接受端没有发送ack,则发生端底层会重新发送,直到收到ack,但发送端接收缓存区是有大小限制的,一旦缓存区满了,应用程序就无法通过该网络通道继续发送数据,注册写事件,就是等缓存区有空闲时,就会通知应用程序 那为什么Netty的Channel内部还要维护一个缓存区呢?这个缓存区,是为了存储应用程序待发送的数据,因为如果底层的缓存区满了后,未发送完的,需要有一个地方存储,这个缓存区就是用来存储这个用的,这个缓存区,还有一个作用就是确保数据的顺序发送,因为一个底层网络通道,会被多个线程共享用来发送数据,这样可以确保一个线程发送时,会锁这个队列,然后完整存储一个数据包,另外一个线程才可以继续写
    展开
    
    1
  • Dylan
    2022-09-15 来自上海
    Java看得真累
    
    
  • William Ning
    2022-07-17
    不是Java开发者,而且文章看有点懵~需要捋捋
    
    
  • 雨落~紫竹
    2022-07-03
    滴 追番卡
    
    
  • 冠生!🤪
    2022-07-02
    netty 的nioEventLoopGroup 默认线程数不等于cpu核数,而是cpu核数*2啊。
    
    