太原PHP培训
达内太原php培训中心

0351-5608878

热门课程

太原php培训机构:深入浅出Netty——服务启动(3)

  • 时间:2016-09-12
  • 发布:太原PHP培训
  • 来源:码农网

ServerBootstrap

通过serverBootstrap.bind(port)启动服务,过程如下:

太原php培训机构

bind过程

doBind实现如下

太原php培训机构

1、方法initAndRegister返回一个ChannelFuture实例regFuture,通过regFuture可以判断initAndRegister执行结果。

2、如果regFuture.isDone()为true,说明initAndRegister已经执行完,则直接执行doBind0进行socket绑定。

3、否则regFuture添加一个ChannelFutureListener监听,当initAndRegister执行完成时,调用operationComplete方法并执行doBind0进行socket绑定。

所以只有当initAndRegister操作结束之后才能进行bind操作。

initAndRegister

太原php培训机构

1、主要负责创建服务端channel,在本例子中,创建了NioServerSocketChannel。

2、为NioServerSocketChannel的pipeline添加handler。

3、注册NioServerSocketChannel到selector。

NioServerSocketChannel

对Nio的ServerSocketChannel和SelectionKey进行了封装。

继承关系:

太原php培训机构

NioServerSocketChannel继承关系

构造方法:

太原php培训机构

1、方法newSocket利用 provider.openServerSocketChannel() 生成Nio中的ServerSocketChannel对象。

2、设置SelectionKey.OP_ACCEPT事件。

AbstractNioMessageChannel构造方法

太原php培训机构

啥也没做…

AbstractNioChannel构造方法

太原php培训机构

设置当前ServerSocketChannel为非阻塞通道。

AbstractChannel构造方法

太原php培训机构

1、初始化unsafe。

这里的Unsafe并非是jdk中底层Unsafe类,用来负责底层的connect、register、read和write等操作。

2、初始化pipeline。

每个Channel都有自己的pipeline,当有请求事件发生时,pipeline负责调用相应的hander进行处理。

unsafe和pipeline的具体实现原理会在后续进行分析。

回到ServerBootstrap的init(Channel channel)方法,添加handler到channel的pipeline中。

太原php培训机构

1、设置channel的options和attrs。

2、在pipeline中添加一个ChannelInitializer对象,每个client请求进来都会执行initChannel方法。

init执行完,需要把当前channel注册到EventLoopGroup。

其实最终目的是为了实现Nio中把ServerSocket注册到selector上,这样就可以实现client请求的监听了。

看看Netty中是如何实现的:

太原php培训机构

因为EventLoopGroup中维护了多个eventLoop,next方法会调用chooser策略找到下一个eventLoop,并执行eventLoop的register方法进行注册。

太原php培训机构

上一篇:太原php培训班:深入浅出Netty——服务启动(2)
下一篇:太原php培训机构:深入浅出Netty——服务启动(4)

太原php培训资源站

太原PHP编程开发并发编程槽与坑

Php开发规划自己的路

太原php培训老生常谈php

选择城市和中心
贵州省

广西省

海南省