Netty Client源码图
2020-06-29 10:39:44 1 举报
Netty Client端源码流程图
作者其他创作
大纲/内容
init(channel);
pipeline.fireChannelReadComplete();
doRegister(promise);
3
doFinishConnect();(NioSocketChannel)
SelectionKey.OP_READ
processSelectedKeys();
赋值一个空的构造方法,用到的时候会调用*.channel入参的构造方法
如果nThreads==0,则值为CPU处理器个数*2
pipeline.fireChannelRead(byteBuf);
new NioEventLoopGroup();
bootstrap.group(group)
属性赋值
this=ChannelHandlerContexthandler().handlerRemoved(this);
调用
TailContext
unsafe.finishConnect();
channel = channelFactory.newChannel();
执行
initChannel(ctx)
调用pipeline里每个handler的channelRegister方法
p.addLast(config.handler());
doRegister();
当channel注册时会调用
ChannelFuture regFuture = config().group().register(channel);
this.handler = handler;
addTask(task)
如果是OP_CONNECT,则完成连接
byteBuf = allocHandle.allocate(allocator);
task
select(wakenUp.getAndSet(false));
new ReflectiveChannelFactory<C>(channelClass)
2
连接
taskQueue.offer(task);
当channel被注册的时候会调用该方法,当该方法返回实例之后,该ChannelInitializer会从channel的pipeline中移除掉
channel注册时调用,调用完会删除该handler(比较难找,需借助debug)
初始化channel,并将感兴趣的事件设置为OP_READ
循环执行完毕后
startThread();
调用pipeline里每个handler的handlerAdded方法
pipeline = newChannelPipeline();
启动客户端去连接服务端
当allocHandle.continueReading()为true时,do
executor = new ThreadPerTaskExecutor(newDefaultThreadFactory());
死循环
processSelectedKeysOptimized();
第二次
eventLoop.execute(new Runnable() { @Override public void run() { register0(promise); } });
executor.font color=\"#ff3333\
上面方法的参数
for循环处理selectedKeys的所有key
bootstrap.connect(\"127.0.0.1\
链式编程,*指前面处理好的结果
super(parent);
ch.configureBlocking(false);
ChannelInitializer
task.run();
int selectedKeys = selector.select(timeoutMillis);
NioEventLoop.run()
第一次
把task线程放入TaskQueue异步执行
NioSocketChannel()
HeadContext
next().register(channel);
chooser = chooserFactory.newChooser(children);
使用到大量的锁完成操作
运行TaskQueue异步队列里的任务
ChannelPipeline p = channel.pipeline();
配置channel非阻塞(对照NIO代码)
构建一个channelFactory
pipeline.invokeHandlerAddedIfNeeded();
第一次selectedKeys为空
重写init方法
channelFactory(new ReflectiveChannelFactory<C>(channelClass));
初始h化NioSocketChannel(对SocketChannel的包装)
javaChannel().finishConnect()
pipeline
1
SingleThreadEventExecutor.this.run();
initChannel(SocketChannel socketChannel)
监听IO事件
final ChannelFuture regFuture = initAndRegister();
children = new EventExecutor[nThreads];
this.constructor = clazz.getConstructor();
死循环执行
*.channel(NioSocketChannel.class)
unsafe.read();(NioByteUnsafe)
pipeline.fireChannelRegistered();
解析和连接
safeExecute(task);
循环nTread次
从group里拿一个线程来处理channel的注册,将其注册到线程自己的的selector上
初始化SocketChannel的pipeline
*.handler(new ChannelInitializer<SocketChannel>() {});
this.group = group;
runAllTasks();
收藏
0 条评论
回复 删除
下一页