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

那么这些伊芙ntExecutor到底是怎么着?大家得到了那些伊夫ntExecutor之后我们进去它的register(channel)方法看看:

图片 26

图片 27

 图片 28

此处注意到,eventloop注册channel实际上是channel注册eventoloop。最终将眼下的eventloop传入到channel中作为channel的性情。

 

这里再次回到unsafe对象。其实
unsafe 尤其首要, 它包裹了对 Java 底层 Socket 的操作, 因而实际是维系
Netty 上层和 Java 底层的要害的大桥

 

图片 29

图片 30

图片 31

图片 32

下边的eventLoop.in伊芙nLoop()判断该eventloop线程是还是不是当前线程。那里关于eventloop的情节要以《Netty4
initAndRegister
解析
》为主,上边的情节总计的貌似。

下一场下边的doregister0调用的是AbstractChannel在子类中的落成。比如当前是NioServerSocketChannel.doBind()同样也是在这么些子类中达成的。

图片 33

 

上面那快是对伊芙ntLoop接口的剖析。

最后大家进去那么些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内部都是透过线程在拍卖种种数码,伊芙ntLoopGroup就是用来治本调度他们的,注册Channel,管理他们的生命周期,下边就来探望伊夫ntLoopGroup是怎么工作的。

伊芙ntLoops的目的是为Channel处理IO操作,贰个伊芙ntLoop可以为五个Channel服务。

伊芙ntLoopGroup会包涵多少个伊芙ntLoop。

参考: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

上面进入到伊芙ntExecutor executor =
next.executor();方法:有上图可见当前的executor属性为null。

图片 58

咱俩进来channel().eventloop().这么些地点必要再次来到多个伊芙ntExecutor类型的靶子。

小编们先看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

不过那里重临的却是一个Nio伊芙ntLoop类型的目标。大家在看一下提到图:

图片 63

先不管大家随后看:下边进入父类的章程:

图片 64

最后大家执行完了那么些方法,再次回到三个伊芙ntLoop类型的对象。

图片 65

图片 66

Nio伊芙ntLoop类型的靶子怎么会是伊芙ntExecutor类型呢?

经过NioEventLoop类型检索我们发现

图片 67

原先伊夫ntLoop继承了伊芙ntExecutor接口。不大概社区办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就在大家13分熟识的NioServerSocketChannel中已毕。

图片 90

图片 91

作者们手动进入那几个类中找到bind方法:

图片 92

那就和我们一向直接用nio写作业时一样了:

图片 93

 

相关文章