netty4 ServerBootstrap.bind(port) debug

代码是netty4自带的例子

图片 1

我们当bind的行前加个断电,下面是ServerBootstrap.bind(port)方法所经历的一对手续。

图片 2

图片 3

图片 4

图片 5

图片 6

图片 7

图片 8

 图片 9

每当AbstractBootstrap.initAndRegister()中实例化一个Channel并展开初始化配置。

(可以参照《Netty4
initAndRegister
解析》)

布局起为于初始化Bootstrap时咱们传入的handlers和一些安。

下面进行channel的初始化(可以参考《Netty
源码分析的 一 揭开 Bootstrap 神秘之红盖头
(客户端)》)

图片 10

在意箭头所示,这里的channelFactory是ReflectiveChannelFacotry.

图片 11

此间就是回来一个NioServerSocketChannel类型的channel.

脚的init(channel)对刚生成的channel进行局部初始化配置。

图片 12

图片 13

图片 14

图片 15

就向生看:

图片 16

图片 17

注意下面注释内容。这里来零星独添加handler的动作,后面一个时延时的,为了保有的handler都为停放在ServerBootstrapAccepter之前。这时候就曾初始化完channle中的eventloop对象了,可以利用eventloop来实行该channel的一对工作。

图片 18

初始化完channel之后:反回到initAndRegister()先押一下eventloop注册到channel。

EventLoop注册Channel

图片 19

图片 20

 图片 21

图片 22

说白了就是是取得一个线程来拍卖这个注册事件。

图片 23

 

图片 24

 

 图片 25

那这EventExecutor到底是啊?我们得了是EventExecutor之后咱们登其的register(channel)方法看看:

图片 26

图片 27

 图片 28

这边注意到,eventloop注册channel实际上是channel注册eventoloop。最终以目前的eventloop传入到channel中当channel的性能。

 

这里返回unsafe对象。其实
unsafe 特别重大, 它包裹了对 Java 底层 Socket 的操作, 因此实际是维系
Netty 上层和 Java 底层的重要性的桥梁

 

图片 29

图片 30

图片 31

图片 32

脚的eventLoop.inEvenLoop()判断该eventloop线程是否当前线程。这里关于eventloop的情节要因《Netty4
initAndRegister
解析》为主,下面的情总结的一般。

接下来下的doregister0调用的是AbstractChannel在子类中的贯彻。比如当前凡是NioServerSocketChannel.doBind()同样也是以斯子类中落实的。

图片 33

 

脚这快是本着EventLoop接口的剖析。

说到底我们登者loop线程的履线程:

图片 34

图片 35

图片 36

图片 37

预先到这个结束我们后续上面的逻辑:

图片 38

图片 39

图片 40

图片 41

图片 42

上述且是initAndRegister()方法吃之逻辑。

跟着向下活动:

图片 43

图片 44

DefaultChannelPipeline{(LoggingHandler#0 =
io.netty.handler.logging.LoggingHandler),
(ServerBootstrap$ServerBootstrapAcceptor#0 =
io.netty.bootstrap.ServerBootstrap$ServerBootstrapAcceptor)}

 图片 45

图片 46

连续主流程:

图片 47

图片 48

此又假设留意eventloop的用法。

Netty内部都是经过线程在拍卖各种数码,EventLoopGroup就是用来保管调度他们之,注册Channel,管理他们的生命周期,下面就是来看看EventLoopGroup是什么样工作之。

EventLoops的目的是吧Channel处理IO操作,一个EventLoop可以吧多独Channel服务。

EventLoopGroup会包含多个EventLoop。

参考:http://www.tuicool.com/articles/mEJvYb

末尾还是顶channel.bind(…)这个办法来绑定。

图片 49

图片 50

图片 51

下进入:final
AbstractChannelHandlerContext next = findContextOutbound();

 

EventExecutor executor = next.executor();

 

前方将eventloop注册到channel中之后,这里取出channel的eventloop。

图片 52

 

图片 53

 AbstractChannelHandlerContext这个事物有特别博文。图片 54

直白循环到ctx.outbound为true的时刻,获取这ctx。

图片 55

 

 

 

图片 56

尚记十分上行下行的图吗,这即是那里的惦记。

图片 57

下面进入到EventExecutor executor =
next.executor();方法:有高达图可清楚即的executor属性为null。

图片 58

咱俩进入channel().eventloop().这个地方需要返回一个EventExecutor类型的靶子。

咱先押channel方法:

图片 59

pipeline=DefaultChannelPipeline{(LoggingHandler#0 =
io.netty.handler.logging.LoggingHandler),
(ServerBootstrap$ServerBootstrapAcceptor#0 =
io.netty.bootstrap.ServerBootstrap$ServerBootstrapAcceptor)}

这里的(LoggingHandler#0 =
io.netty.handler.logging.LoggingHandler)是啊不好?

尚记得上面的init(channel)吗,我们于那边补充加了handler和ServerBootstrapAccepter

脚我们还会干到是handler。

图片 60

 

事先凭我们先行上pipeline.channel();方法

图片 61

return channel().eventLoop();这里执行完channel()方法后我们进入eventloop()方法:
这里需要返回一个EventExecutor类型的对象。

图片 62

然这里归的却是一个NioEventLoop类型的目标。我们以羁押一下关系图:

图片 63

先行任我们随后看:下面进入父类的主意:

图片 64

末段我们尽了了这措施,返回一个EventLoop类型的对象。

图片 65

图片 66

NioEventLoop类型的目标怎么会是EventExecutor类型呢?

透过NioEventLoop类型检索我们发现

图片 67

原EventLoop继承了EventExecutor接口。没道社区办idea功能于简陋,就无写类型涉及图了。

图片 68

 

那我们就netty流程往下走:

图片 69

图片 70

图片 71

 

在下面这个艺术这里循环所有的handler的bind()方法。

图片 72

 

图片 73

 

 

图片 74

这里的handler:LoggingHandler。还记得上面的疑点也。答案于这边。

 

图片 75

 当前底handler是LoggingHandler那么我们虽进去及:

图片 76

此处又一个不行值得注意的地方。LoggingHandler的bind()方法并从未写啊业务逻辑,只打印了只日志:

18:33:33.694 [nioEventLoopGroup-2-1] INFO 
i.n.handler.logging.LoggingHandler – [id: 0x62c8b900] BIND:
0.0.0.0/0.0.0.0:8007

然后径直调用了下一个handler的bind()方法。

这bind()方法是概念在ChannelOutboundHandler中的方法。

备我们就算行入到下一样赖巡回中了:

图片 77

开始循环了。

 

 下一个handler:图片 78

图片 79

图片 80

图片 81

图片 82

图片 83

 到此终于跳出netty框架到老nio层了!

图片 84

图片 85

但到即的时程序没有上bind直接跨越出来了:

图片 86

图片 87

图片 88

此地成功了?

图片 89

 

 我们特别从独断点到特别nio
bind的地方。根据上述之流程分析我们懂得最后的nio层bind就于咱们大熟悉的NioServerSocketChannel中落实。

图片 90

图片 91

咱俩手动进入者看似中找到bind方法:

图片 92

立刻便和咱们平素径直用nio写作业时一样了:

图片 93

 

相关文章