netty

netty面试题 blog.csdn.net/pcceo1/arti…

netty的底层是基于java的nio技术。 bio,nio,aio的解释

bio:同步阻塞,每一次连接,都开启一个线程。(连接数少场景) nio:同步非阻塞。一个线程处理多个请求。即客户端连接服务器会注册到多路复用器,多路复用器轮询i/o请求,并处理连接(用于连接数较多,连接时间短的场景) aio:异步非阻塞。发生的连接先有操作系统过滤,只有有效的连接,才会到达服务器(连接时间长且连接数较多的场景)

nio详细介绍:nio三大核心channel,buffer,selector nio是面向缓冲区编程的,数据读取到buffer,需要时在缓冲区前后移动,这增加了处理数据的灵活性,同时也实现了非阻塞。(因为线程不用一直等待读取数据,可以先做其他的事情,有数据了,在再去读取)

http2.0使用了多路复用的技术,做到了同一个连接可以发多个请求,并且发送的数量比http1.1要大

nio和bio比较 bio以流的方式处理数据,nio使用的是块的方式即存到buffer中,通过buffer读取数据; bio是阻塞的,nio是非阻塞的; bio使用流的操作,nio是基于buffer和channel,数据总是从channel到buffer或者从buffer到channel selector用于监听多个通道的事件,连接请求和数据到达等,因此使用单个线程可以监听多个客户端通道。 selector,buffer和channel的关系图: nio组件关系说明: 每个channel对应一个buffer 每个selector对应一个线程,一个线程对应多个channel 程序切换到那个channel由事件决定,也就是event selector会根据不同的时间,在各个通道中切换 buffer就是一个内存块,底层是一个数组 数据的读取和写入都是通过buffer,读写的切换是使用flip方法。 channel是双向的。

buffer是一个顶级的父类,为了存储不同类型的数据,它有多个子类: buffer有四个转态位: buffer相关的api bytebuffer的相关api

channel的特点: 可以同时进行读写,而流只能读或者写 可以异步读取数据 可以从buffer读数据,也可以从buffer写数据 常用的channel类有:filechannel(文件数据的读取)、datagramchannel(udp数据的读写)、serversocketchannel和socketchannel(tcp数据的读写)

filechannel主要是本地文件的io,常用的方法

BYTEbuffer支持的类型化的put和get,put放入的什么类型,get要使用相应的类型取出,否则会报异常。

selector选择器能够检测到注册的通道上是否有事件发生,多个channel可以以事件的形式注册到同一个channel

selector管理多个channel,避免了开启多个线程,减少了线程间上下文切换的花销

selector相关api

nio相关组件关系selector、selectionkey、seversocketchannel和socketchannel关系

客户端连接时,会通过serversocketchannel得到socketchannel selector进行监听,通过select方法,返回有事件发生的通道个数

将socketchannel注册到selector上,register(select sel,int ops),一个selector可以注册多个socketchannel

注册后,可以通过selectionkey,会和该selector关联 通过selectionkey (有事件发生)

通过selectionkey获取socketchannel 通过channel处理事件 selectionkey的相关方法 nio与零拷贝 netty组件


作者:许准
链接:https://juejin.im/post/6881221184189399048
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
原文地址:https://www.cnblogs.com/zj-xu/p/13790677.html