一、服务端时序图:
1、创建ServerBootStrap实例
2、通过ServerBootStrap实例创建EventLoopGroup(线程池,事件循环组)
3、有客户端连接请求,就通过EventLoopGroup生成一个channel(通道,类似于socket),
将其注册到EventLoop(线程)里面,这个线程会循环监听channel的IO事件。
4、创建管道ChannelPipeline和channel绑定,里面有多个阀门ChannelHandler (具体的处理逻辑就写在这里),
当发生IO事件的时候,会按照顺序执行这些ChannelHandler里面的逻辑。
5、ChannelHandler里面的逻辑是另外由线程池产生的线程执行的,不会占用当前IO操作的线程资源。
二、Netty服务器端开发步骤
1、创建两个Reactor线程池,一个bossGroup(主线程池,管理连接事件),
一个workerGroup(从主管读写IO操作)
2、创建启动配置对象bootstrap,并绑定两个线程池(bossGroup,workerGroup)。
3、开始链式设置bootstrap:
<1>、设置通道类型为NioserverSocket(非阻塞通道)
<2>、设置boosGroup里面的EventLoop里面的线程队列最大个数(option是设置主线程参数)
<3>、设置workerGroup里面的EventLoop启用心跳保活机制(childOption是设置从线程参数)
<4>、向channel(通道)对应的pipeline(管道)添加channelHandler(处理器)
当一个客户端连接上服务器之后,会产生一个channel对象并绑定到具体的
workerGroup中的一个eventLook上的selecter(监听器上),
当监听到读写IO操作准备就绪的时候,就会执行这个channel对应的pipeline
里面的一系列channelHandler处理器(链式调用)。
channelHandler分为两类,一种是入站处理器(服务器端读取到客户端的消息)
一种是出站处理器(服务器向客户端推送的消息)
按照添加顺序,入站(服务发出的消息)类型处理器顺序执行
出站(服务接受的消息)按逆序执行
<5>、连接服务器,阻塞等待到连上完成(异步操作,通过事件触发)
<6>、关闭连接,阻塞(异步操作,通过事件触发)
<7>、优雅关闭线程池group,释放所有资源。
4、处理器的编写:
(1)、入站(读取数据,客户端请求服务端):
通过 ChannelInboundHandlerAdapter 实现,具体内容如下:
流程:
<1>、继承ChannelInboundHandlerAdapter ,实现以下抽象方法:
channelRead:监听接收消息事件
channelReadComplete:监听接收消息完成事件
exceptionCaught:监听异常事件
<2>、可以通过channelHandlerContext处理器上下文
获取到很多信息,比如连接的通道信息等等。
<3>、通过ByteBuf解码消息。
三、Netty客户端开发步骤:
流程:
1、创建Reactor线程池group
2、创建启动配置类bootstrap
3、开始配置bootstrap
<1>、指定EventLoopGroup来处理客户端IO事件
<2>、设置通道类型为NiosocketChannel
<3>、设置要连接的服务器端地址和端口
<4>、向channel对应ChannelPipeline(管道)中添加多个channelHandler(处理器):
只要客户端和服务器建立了连接,就会创建一个channel,
而这个channel会对应创建一个ChannelPipeline,
我们可以通过channelInitializer(通道加载器)对象的initChannel方法
来向管道里面加入一个channelHandler(处理器)。
可以添加多个处理器,这种处理器分为不同的类型(出站和入站),
按照添加顺序,入站(服务发出的消息)类型处理器顺序执行
出站(服务接受的消息)按逆序执行
4、连接服务器,阻塞等待到连上完成(异步操作,通过事件触发)
5、关闭连接,阻塞(异步操作,通过事件触发)
6、优雅关闭线程池group,释放所有资源。