定义

netty是一款异步的事件驱动的网络应用程序框架,支持快速开发可维护的高性能面向协议的服务器。

netty提供了对TCP/IP、UDP和文件传输的支持,具有高并发,传输快和封装好的优点。

高并发:netty基于NIO开发的网络通信框架,并发性能得到了提升。

传输快:netty基于NIO的零拷贝,接受数据时,开辟一块内存直接从IO读取数据到ByteBuf,操作时直接操作ByteBuf,加快了传输速度。

封装好:隐藏了很多NIO的细节,提供了易于使用的API,提供心跳、重连机制、拆包、粘包等处理方案。

线程模型

单线程模型

单线程模型是又一个线程响应客户端连接

 

Android开发 nettyUDP支持接收多个用户嘛 netty支持多少并发_客户端

多线程模型

一个线程响应客户端消息,相应成功后为每一个连接开启一个线程取处理业务

 

Android开发 nettyUDP支持接收多个用户嘛 netty支持多少并发_客户端_02

主从线程模型

线程池处理客户端响应,另一个线程池处理业务

 

Android开发 nettyUDP支持接收多个用户嘛 netty支持多少并发_回调方法_03

Android开发 nettyUDP支持接收多个用户嘛 netty支持多少并发_线程模型_04

数据结构

NioEventLoop与NioEventLoopGroup

NioEventLoop是一个线程,后者是一个线程池,包含多个线程。

每一个NioEventLoop都绑定了一个Selector,所以在Netty线程模型中,是由多个Selector在监听IO就绪事件。

一个Channel绑定一个线程,这个连接所有的ChannelHandler都是在一个线程中执行的,避免多线程干扰。多个ChannelHandler注册到ChannelPipline链表中,按照顺序执行。

Channel

java原生api提供的网络通道接口,在jdk1.4之前采用ServerSocket和Socket代表服务端和客户端,1.4之后使用ServerSocketChannel和SocketChannel代表服务端和客户端。Netty对这两个接口进行了封装,使用NioServerSocketChannel和NioSocketChannel进行封装。

 

Android开发 nettyUDP支持接收多个用户嘛 netty支持多少并发_回调方法_05

ChannelHandler

netty抽象了一个ChannelHandler来处理输入输出事件,对于输入输出事件,只需要集成适配器,重新需要使用的方法就可以用于专享处理。提供的适配器有三种ChannelHandlerAdapter、ChannelInboundHandlerAdapter 、ChannelOutboundHandlerAdapter

 

Android开发 nettyUDP支持接收多个用户嘛 netty支持多少并发_回调方法_06

ChannelPipeline

netty建立了一个管道的概念,让多个handler顺序执行,一般的处理顺序为:粘包解包,数据反序列化,业务处理,每个Channel调用一次构造函数,因此在构造Channel的时候需要将管道建好,默认使用DefaultChannelPipeline来构造管道。

DefaultChannelPipeline内部通过双向链表建立ChannelHandler的前后关系,内部节点为AbstractChannelHandlerContext类。DefaultChannelPipeline是将普通的Handler包装成AbstractChannelHandlerContext类再添加到链表中。

ChannelHandler

Channel事件处理器,它的子接口ChannelInboundHandler和ChannelOutboundHandler用于处理事件的输入和输出

ChannelInboundHandler所提供的回调方法处理时机

回调方法

触发时机

client

server

用途

channelRegistered

当前channel注册到EventLoop

true

true

记录连接用户

channelUnregistered

当前channel从EventLoop取消注册

true

true

断线重连

channelActive

当前channel激活的时候

true

true

 

channelInactive

当前channel不活跃的时候

true

true

主动断线

channelRead

当前channel从远端读取到数据

true

true

 

channelReadComplete

read消费完读取的数据的时候被触发

true

true

 

userEventTriggered

用户事件触发的时候

true

true

心跳机制

channelWritabilityChanged

channel的写状态变化的时候触发

true

true

 

ChannelOutboundHandler回调方法

回调方法

触发时机

client

server

用途

bind

bind操作执行前触发

false

true

 

connect

connect 操作执行前触发

true

false

 

disconnect

disconnect 操作执行前触发

true

false

 

close

close操作执行前触发

false

true

 

deregister

deregister操作执行前触发

true

true

 

read

read操作执行前触发

true

true

 

write

write操作执行前触发

true

true

 

flush

flush操作执行前触发

true

true