Netty源码流程图
2022-03-24 17:23:53 0 举报
Netty源码流程图
作者其他创作
大纲/内容
channelFactory.newChannel();
从head开始调用ServerChannel的pipiline里的所有InboundHandler
创建accept连接事件
SocketUtils.accept(javaChannel());
直接调用socketChannel的pipeline里面所有handler的channelRead方法
绑定端口
TailContext
initChannel(ctx)
ServerBootStrap.channel对NioServerSoceketChannel包装ReflectiveChannelFactory
有事件后,将注册到workGroup上
super(parent);
死循环监听IO事件
new Runnable() { @Override public void run() { register0(promise); } }
ServerBootStrap
AbstractNioChannel
HeadContext
channel注册时调用,调用完删除该handler(比较难找的调用逻辑可以借助debug跟踪)
异步执行
MultithreadEventLoopGroupnext().register(channel)
将连接过来的socketChannel注册到workGroup里的一个线程的selector上
processSelectedKeys();
将channel感兴趣的事件设置为OP_READ
boosGroup
serverSocketChannel pipeline
注册channel到selector(对照NIO代码)
newChannelPipeline()
将socketChannel包装为NIOSocketCannle
获取nioServerSocketChannel
当有客户端往服务端发送数据Socketchannel则会发生OP_READ事件
ch.configureBlocking(false);
addTask(task);
newChannelPipeline();
runAllTasks()
连接端口
task的run方法
doRegister();
select(wakenUp.getAndSet(false));
pipeline.fireChannelActive();
NIOEventLoop.run()
绑定网络监听端口
死循环执行
super(parent)
doBind(final SocketAddress localAddress)
taskQueue.offer(task);
unsafe.read();NioMessageUnsafe
eventLoop.execute(new Runnable() { @Override public void run() { register0(promise); } });
初始化和注册
ch.configureBlocking(false);
NioServerSocketChannel
PendingHandlerCallback task
不同线程组里的线程的selector监听处理
pipeline
eventLoop.execute(new Runnable() { @Override public void run() { register0(promise); } });
callHandlerAdded0(ctx);
task.run()
processSelectedKeysOptimized();
initAndRegister()
初始化ServerChannel的pipeline
调用pipeline里每个handler的channelRegistered方法
当channel注册时会调用
doReadMessages(readBuf);
设置非阻塞
SocketChannel注册逻辑跟ServerSocketChannel注册逻辑一样,注册完会调用socketchannel里的ChannelInitializer把里面我们自己谢的Handler全部放入pipeline
startThread();
获取事件OP_READ| OP_ACCEPT
register0(promise);
SingleThreadEventExecutor.this.run();
ChannelInitializer
for循环拿到selectKeys里的所有的key
readBuf里放的是OP_ACCEPT事件连接过来的所有SocketChannel
ServerBootStrapAcceptor
调用pipeline里面每个handler的handlerAdded方法
bind(port)
走到bootstrapStrap类中的channelRead方法
监听端口
channel.pipeline();
child.pipeline().addLast(childHandler)
callHandlerAddedForAllHandlers();
将task 放入taskqueue中
p.addLast(new ChannelInitializer<Channel>() { ……… });
selector.select(timeoutMillis);
ServerSocketChannel.init()
pipeline.fireChannelRead(readBuf.get(i));
constructor.newInstance();
task.execute();
NioServerSocketChannel获取SocketChannel(对照NIO代码)
SingleThreadEventExecutor类中的execute方法
childHandler就是netty服务端初始化代码我们自己写的channelInitializer
workGroup
ServerSocketchannel
把ServerChannel 绑定到网络端口,并开启监听
nettyServerHandler
config().group().register(channel);
配置channel非阻塞
运行TaskQueue异步队列里的任务
初始化SocketChannel创建pipeline
childGroup.register(child)
从boosgroup里拿一个线程来处理channel的注册将其注册到线程自己的selector上
初始化时候,添加channelInitializer
执行eventloop的execute方法,将异步线程放入队列中
pipeline.invokeHandlerAddedIfNeeded();
当timeoutMillis超时或有事件发生会break
NioServerSocketChannel()构造方法this(newSocket(DEFAULT_SELECTOR_PROVIDER));
初始化channel,并将channel事件设置为OP_ACCEPT
Client
收藏
0 条评论
下一页