logo  

物联网开发——设计与实现

物联网开发——设计与实现
作者: 陈安廉

摘要:软件开发系列


netty源码


2021-11-16 11:20:05

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 用于处理入站和出站事件。