在启动配置中的方法channel(NioServerSocketChannel.class)
会创建一个ReflectiveChannelFactory
并赋值给成员变量channelFactory
。当调用绑定端口号方法bind(8899)
时
2.NioServerSocketChannel的构造函数
在构造函数中首先调用静态方法newSocket()
,创建一个Java Nio ServerSocketChannel实例,它继承SelectableChannel
。
然后调用父类AbstractNioChannel
的构造函数,它会持有上一步创建的ServerSocketChannel
实例并赋值给变量ch
,同时配置为非阻塞ch.configureBlocking(false)
,如下:
1. ChannelPipeline的创建
查看父类AbstractChannel
可以发现,在构造函数中,创建了ChannelPipeline,并赋值给pipeline
对象.
chanel 通过变量pipeline持有ChannelPipeline。
DeflautChannelPin的构造函数接受this为参数,因此ChanelPipe也持有Channel.
2.ChannelPpeline的拦截过滤器模式
ChannelPipeline 中可以添加多个ChannelHander:
接口提供了ChannelHandler
的方法,如addFirst
等,removeLast()
等。
ChannelPipeline是线程安全的,可以随时添加或删除ChannelHandler。
channelPIpeine 中IO事件传播靠
3.channelPipelie 中添加处理耗时任务,有2种方式:
或者在自定义Handler中使用线程池ExecutorService处理。
??? netty 如何接受数据呢?
读取数据本质:socketChannelImpl(java.nio.ByteUffer)
nioSocketChangnel read() 是读数据,nioserverSocketchangnel read() 是创建连接。
pipeine
??? netty 如何做业务处理呢?
多路复Ca用selector 季守东OP_READ 事件
处理OP_READ事件,NIOSocketChannel.NIOSocetchanbgnel
Hander: 执行资格:
Hander 伤心爱你了ChannelnboundHanderr
实现方法channelRead不能家注解@skip
具体给一下跟一下代码:
findContextInbound:877, AbstractChannelHandlerContext (io.netty.channel)
fireChannelRegistered:145, AbstractChannelHandlerContext (io.netty.channel)
channelRegistered:1383, DefaultChannelPipeline$HeadContext (io.netty.channel)
invokeChannelRegistered:166, AbstractChannelHandlerContext (io.netty.channel)
invokeChannelRegistered:152, AbstractChannelHandlerContext (io.netty.channel)
fireChannelRegistered:815, DefaultChannelPipeline (io.netty.channel)
register0:505, AbstractChannel$AbstractUnsafe (io.netty.channel)
access$200:417, AbstractChannel$AbstractUnsafe (io.netty.channel)
run:474, AbstractChannel$AbstractUnsafe$1 (io.netty.channel)
safeExecute$$$capture:164, AbstractEventExecutor (io.netty.util.concurrent)
safeExecute:-1, AbstractEventExecutor (io.netty.util.concurrent)
- Async stack trace
addTask:-1, SingleThreadEventExecutor (io.netty.util.concurrent)
execute:828, SingleThreadEventExecutor (io.netty.util.concurrent)
execute:818, SingleThreadEventExecutor (io.netty.util.concurrent)
register:471, AbstractChannel$AbstractUnsafe (io.netty.channel)
register:87, SingleThreadEventLoop (io.netty.channel)
register:81, SingleThreadEventLoop (io.netty.channel)
register:86, MultithreadEventLoopGroup (io.netty.channel)
initAndRegister:323, AbstractBootstrap (io.netty.bootstrap)
doBind:272, AbstractBootstrap (io.netty.bootstrap)
bind:268, AbstractBootstrap (io.netty.bootstrap)
bind:246, AbstractBootstrap (io.netty.bootstrap)
main:74, EchoServer (io.netty.example.echo)
处理业务本质:数据在pipeLine 中所有的hander channelRead() 执行过程
hander 要实现IO.netty.channel.channelinaINbound#changeReader(chanhelHaderContext ctx,object msg)
且不能加上注解@skip
默认处理线程就是ChannelPipeline: