Netty服务端源码流程图
2023-03-09 22:08:12 0 举报
netty流程图
作者其他创作
大纲/内容
获取NioServerSocketChannel的pipelinechannel.pipeline()
next().register(channel);
调用完删除handler
pipeline.fireChannelRead(byteBuf);
TailContext
当有事件发生或者超时时break
HeadContext
初始化channelHandler
select(wakenUp.getAndSet(false));
调用pipeline里面每个handler的ChannelRegistered();方法
startThread()
设置NioServerSocketChannel为非阻塞
pipeline.fireChannelActive();
NioEventLoop.run()
ChannelInitializer
NioMessageUnsafe里面的read
childGroup.register(child)
依次调用pipeline里面每个handler的handlerAdd方法
将channel感兴趣的事件设置为OP_READ
死循环监听select里面的IO事件
调用ReflectiveChannelFactory的newChannel方法创建NioServerSocketChannel实例
从bossgroup中获取一个线程来处理serverSocketChannel的注册,将ServerSocketChanne注册到自己的selector上
客户端第一次和服务端建立连接时调用
当发生OP_READ事件
childHandler就是ServerBootstrap初始化时的ChannelInitializer
将传过来的sockChannel注册到workerGroup里面的一个线程的selecter中
pipeline = newChannelPipeline();
eventLoop.execute会进入SingleThreadEventExecutor里面调用execute方法进行addTask(task)
死循环执行
初始化channel,并将channel感兴趣的事件设置为OP_ACCEPT
client
ServerBootstrapAcceptor里面的ChannelRead方法
NioEventLoop里面的run方法
task.run
p.addLast(new ChannelInitializer)
pipeline.fireChannelRead(readBuf.get(i));
super(parent);
socketChannel pipeline
register0(promise);
doStartThread()
socketChannel注册逻辑和ServerSocketChannel注册逻辑一样注册完会调用socketChannel channelInitializer将我们自己的handler添加到pipeline
AbstractUnsafe中的registereventLoop.execute(new Runnable() { @Override public void run() { register0(promise); } });
unsafe.read();
doReadMessages(readBuf)
调用服务端socketChannel里 pipeline里面handler的channelRead方法
selector.select(timeoutMillis);
初始化socketChannelpipeline
initAndRegister
初始化socketchannel的pipeline
设置非阻塞
for循环处理selectkeys里面所有的key
给group属性(boss)和childGroup属性(workers)赋值
processSelectedKeysOptimized();
initChannel(final Channel ch)
ch.configureBlocking(false);
taskQueue.offer(task)
newChannelPipeline()
NettyServerHandler
OP_READ
获取socketChannel
readBuf里面封装的是所有OP_ACCEPT事件的socketChannel
pipeline.invokeHandlerAddedIfNeeded();
当注册handler时会调用
processSelectedKeys()
构建ServerBootstrap
向NioServerSocketChannel的pipeline中添加ServerBootstrapAcceptor
当发生OP_ACCEPT事件
构建一个ReflectiveChannelFactory类并设置constructor(反射NioServerSocketChannel)属性
ServerBootstrapAcceptor
ServerBootstrap.init(channel);
SingleThreadEventLoop中的register
将socketchannel包装成NioSocketChannel
pipeline
调用bind(9000)方法
NioByteUnsafe里面的read方法
绑定网络监听端口
doRegister();
child.pipeline().addLast(childHandler);
config().group().register(channel)
NioServerSocketChannel里面的doReadMessages方法SocketUtils.accept(javaChannel());
pipeline.fireChannelRegistered();
runAllTasks();
SingleThreadEventExecutor.this.run()
task.run()
收藏
0 条评论
下一页