Netty 基本组件小结--Channel、EventLoop、Bootstrap等
Multi threaded behavior with UDP server does not seem to work (4.0.6.Final) #1706:netty使用多个线程accept UDP。
Multi threaded UDP server with Netty
channel:socket的升级版,对应一个连接
EventLoopGroup:netty线程池
EventLoop:netty的线程,EventLoop对应很多个channel,一个channel只能对应一个EventLoop。UDP不是面向连接的,是面向报文的,所以一个端口就是一个NioDatagramChannel,只能对应一个EventLoop。所以默认情况下,只会有一个线程来处理UDP的accept,除非使用EpollEventLoopGroup(SO_REUSEPORT),本质上是多个线程监听同一个端口,通过OS做负载均衡。
NioEventLoop 中维护了一个线程和任务队列,支持异步提交执行任务。
Bootstrap 是客户端程序的启动引导类,UDP只能用Bootstrap。
ServerBootstrap 是服务端启动引导类,TCP server,定义分别指定boss和worker EventLoopGroup:netty。
ByteBuf:
pool和unpool:是否池话管理的内存
heap和direct:堆内存还是堆外内存
safe和unsafe:是否允许使用堆外内存,直接读写堆外内存是不安全的,可能出现OS层面错误导致jvm core dump。-Dio.netty.noUnsafe=true使用堆内存。
相比于C语言的谁申请谁释放,netty则是谁最后使用谁释放。
writeAndFlush():
执行writeAndFlush,会把数据送到outHandler链。
Future 和 ChannelFuture:
提供了另一种在操作完成时通知应用程序的方式。这个对象可以看作是一个异步操作的结果的占位符;它将在未来的某个时刻完成,并提供对其结果的访问。
ChannelPromise:
是ChannelFuture的扩展,允许设置I/O操作的结果,使ChannelFutureListener可以执行相关操作
Selector:
Netty 基于 Selector 对象实现 I/O 多路复用,通过 Selector 一个线程可以监听多个连接的 Channel 事件。
【ChannelHandler】:
ChannelHandler 是一个接口,处理 I/O 事件或拦截 I/O 操作,并将其转发到其 ChannelPipeline(业务处理链)中的下一个处理程序。
ChannelHandler 本身并没有提供很多方法,因为这个接口有许多的方法需要实现,方便使用期间,可以继承它的子类:
ChannelInboundHandler 用于处理入站 I/O 事件。
ChannelOutboundHandler 用于处理出站 I/O 操作。
或者使用以下适配器类:
ChannelInboundHandlerAdapter 用于处理入站 I/O 事件。
ChannelOutboundHandlerAdapter 用于处理出站 I/O 操作。
ChannelDuplexHandler 用于处理入站和出站事件。