Netty源码分析第1章(Netty启动流程)—->第3节: 服务端channel初始化

释放双眼,带上耳机,听听看~!

Netty源码分析第1章(Netty启动流程)—->第3节: 服务端channel初始化

 

Netty源码分析第一章:Netty启动流程

** **

第三节:服务端channel初始化

 

回顾上一小节的initAndRegister()方法:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1final ChannelFuture initAndRegister() {
2    Channel channel = null;
3    try {
4        //创建channel
5        channel = channelFactory.newChannel();
6        //初始化channel
7        init(channel);
8    } catch (Throwable t) {
9        //忽略非关键代码
10    }
11    ChannelFuture regFuture = config().group().register(channel);
12    //忽略非关键代码
13    return regFuture;
14}
15

简单回顾上一小节内容, 我们跟完了创建channel的步骤, 知道了Netty的NioServerSocketChannel和jdk的ServerSocketChannel之间的关系, NioServerSocketChannel和jdk的channel是组合关系, 在其父类AbstractChannel中有jdk的channel的一个成员变量, 通过创建netty的channel为jdk的channel赋值

 

我们继续往下看init(Channel)方法

因为是ServerBootstrap对象调用的init()方法, 所以我们跟到ServerBootstrap类的init()方法中:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
1void init(Channel channel) throws Exception {
2    //获取用户定义的选项(1)
3    final Map<ChannelOption<?>, Object> options = options0();
4    synchronized (options) {
5        channel.config().setOptions(options);
6    }
7
8    //获取用户定义的属性(2)
9    final Map<AttributeKey<?>, Object> attrs = attrs0();
10    synchronized (attrs) {
11        for (Entry<AttributeKey<?>, Object> e: attrs.entrySet()) {
12            @SuppressWarnings("unchecked")
13            AttributeKey<Object> key = (AttributeKey<Object>) e.getKey();
14            channel.attr(key).set(e.getValue());
15        }
16    }
17    //获取channel的pipline(3)
18    ChannelPipeline p = channel.pipeline();
19    //work线程组(4)
20    final EventLoopGroup currentChildGroup = childGroup;
21    //用户设置的Handler(5)
22    final ChannelHandler currentChildHandler = childHandler;
23    final Entry<ChannelOption<?>, Object>[] currentChildOptions;
24    final Entry<AttributeKey<?>, Object>[] currentChildAttrs;
25    //选项转化为Entry对象(6)
26    synchronized (childOptions) {
27        currentChildOptions = childOptions.entrySet().toArray(newOptionArray(childOptions.size()));
28    }
29    //属性转化为Entry对象(7)
30    synchronized (childAttrs) {
31        currentChildAttrs = childAttrs.entrySet().toArray(newAttrArray(childAttrs.size()));
32    }
33    //添加服务端handler(8)
34    p.addLast(new ChannelInitializer<Channel>() {
35        //初始化channel
36        @Override
37        public void initChannel(Channel ch) throws Exception {
38            final ChannelPipeline pipeline = ch.pipeline();
39            ChannelHandler handler = config.handler();
40            if (handler != null) {
41                pipeline.addLast(handler);
42            }
43            ch.eventLoop().execute(new Runnable() {
44                @Override
45                public void run() {
46                    pipeline.addLast(new ServerBootstrapAcceptor(
47                            currentChildGroup, currentChildHandler, currentChildOptions, currentChildAttrs));
48                }
49            });
50        }
51    });
52}
53

初看起来代码好长, 其实并不复杂, 这里对每一步进行一个简述:

步骤(1), (2)是获取的用户代码中定义的选项和属性

 

步骤(3)是获取channel的pipeline, 这个channel就是上一小节我们学习创建的NioServerSocketChannel, 我们知道每个channel都有个pipeline的属性, 是AbstractChannel的成员变量, 而这里的pipeline()就是获取其与channel绑定的pipeline, 这个pipline, 会在后面的章节中讲到

 

步骤(4)是获取worker线程组, 我们知道这个worker线程组就是在用户代码中创建的NioEventLoopGroup, 后来在ServerBootstrap的group()方法中赋值为ServerBootstrap的成员变量, 而这里是获取其成员变量, 并赋值到局部变量currentChildGroup中, NioEventLoop相关知识会在后面的章节讲到

 

步骤(6), (7)是将选项和属性转化成Entry对象

 

步骤(8)是添加服务端Handler, 是通过和channel绑定的pipeline调用addLast()方法进行添加, 传入一个ChannelInitializer类的子类对象, 至于addLast方法是做什么的, ChannelInitializer是做什么的, 后绪章节都会给大家详细剖析, 这里不必深究

 

这一小节我们了解了有关channel初始化的过程, 我们目前只需了解其大概步骤, 有关addLast的逻辑会在后面的章节进行详细剖析

 

上一节: NioServerSocketChannel的创建

下一节: 注册多路复用

 

posted on
2018-12-31 18:00 向南是个万人迷 阅读(
…) 评论(
…) 编辑 收藏

转载于:https://www.cnblogs.com/xiangnan6122/p/10202646.html

给TA打赏
共{{data.count}}人
人已打赏
安全技术

Bootstrap 4 Flex(弹性)布局

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索