netty源码
2022-11-03 19:40:44 0 举报
总结
作者其他创作
大纲/内容
当timeoutMillis超时或有事件发生会break处理
initAndRegister()
HeadContext
newChannelPipeline()
bossGroup
NioServerSocketCHannel()
TailContext
newChannelPipeline();
for循环处理selectedKeys里的所有key
selector.select(timeoutMillis);
监听端口
initChannel(ctx)
processSelectedKeysOptimized();
将channel感兴趣事件设置为OP_READ
workGroup
运行TaskQueue异步列队里的任务
startThread()
死循环执行
直接调动SocketChannel的pipeline里的所有handler的channelRead方法
当channel注册时会调用
childHandler就是netty服务端初始代码我们自己写的ChannelInitializer
初始化ServerChannel的pipeline
super(parent)
将连接过来的socketCHannl注册到workGroup里的一个线程的selector上
pipeline
NioEventLoop.run()
当有客户端链接,则会发生OP_ACCEPT事件
初始化channel,并将channel感兴趣的时间设置为OP_ACCEPT
ch.configureBlocking(false)
NioByteUnsafeunsafe.read();
register0(promise)
OP_READ
select(wakenUp.getAndSet(false));
绑定网络监听接口
channelFactory.newChannel()
从head开始调用ServerChannel的pipline里的所有lnboundHandler
初始化NioServerSocketChannel(对ServerSocketChannel的包装)
ChannelInitializer
调用pipeline里每个handler的handlerAdded方法
doRegister()
task.run()
pipeline.invokeHandlerAddedIfNeeded();
client
ServerBootstrap
taskQueue.offer(task)
socketChannel pipeline
channel注册时调动,调用会删除该handler(比较难找到的调用逻辑可以借助debug跟踪)
把task线程放入TaskQueue异步执行
OP_READ | OP_ACCEPT
processSelectedKeys();
childGroup.register(child)
当有客户端往服务器发送数据,SocketChannel则会发生OP_READ事件
NettyServerHandler
配置channel非阻塞(对照NIO代码)
p.addLast(new ChannelInitializer<Channel>() {....})
NioEventLoop.run
ServerBootstrap.init(channel)
死循环执行监听IO事件
NioServerSocketChannelSocketUtils.accept(javaChannel())
把ServerChannel绑定到网络端口
SingleThreadEventExecutor.this.run();
bind(port)
task
config().group().register(channel)
将SocketChannel包装为NioSocketChannel
child.pipeline().addLast(childHandler)
SocketChannel注册逻辑跟ServerSocketChannel注册逻辑一样,注册完会调用SocketChannel里的ChannelInitializer把里面我们写的Handler全部放入pipeline
ServerBootstrapAcceptor.channelRead()
调用pipeline里每个handler的channelRegistered方法
runAllTasks();
初始化SocketChannel的pipeline
ServerBootstrapAcceptor
pipeline.fireChannelRead(byteBuf);
NioMessageUnsafe unsafe.read();
readBuf里放的是OP_ACCEPY事件连接过来的所有SocketChannel
channel.pipeline()
super(parent);
ch.configureBlockIng(false)
next().register(channel)
注册channel到selector(对照NIO代码)
doReadMessages(readBuf);
pipeline.fireChannelRead(readBuf.get(i));
addTask(task)
从bossGroup里拿一个线程来处理channel的注册,将其注册到线程自己的selector上
eventLoop.execute(new Runnable() { @Override public void run() { register0(promise); } });
serverSocketChannel pipeline
for循环处理selectedKeys的所有key
获取SocketChannel(对照NIO代码)
pipeline.fireChannelRegistered();
0 条评论
下一页