netty启动流程
2021-11-12 11:41:34 0 举报
AI智能生成
1
作者其他创作
大纲/内容
netty是一个异步、事件驱动的客户端/服务端网络框架,基于Java nio,隐藏了其内部复杂性,提供易于使用的api,可以在其基础上开发多种网络协议<br>
直接开发nio程序需要解决断线重连,心跳检测,粘包半包,网络拥塞,异常处理等问题,而netty对其进行了良好的封装,解决了上诉问题,且拥有高并发,零拷贝等特点<br>
netty启动流程
NioEventLoopGroup的创建
创建executor,默认是<font color="#ff0000">ThreadPerTaskExecutor</font><br>
根据指定线程数<b>创建n个NioEventLoop</b>, 设置它们的executor,parent=EventLoopGroup,创建了taskQueue,selector<br>
服务端绑定
<b>创建NioServerSocketChannel</b>,创建了它的ServerSocketChannel,readInterestOps=OP_ACCEPT, pipeLine<br>
向boss EventLoop的taskQueue添加任务<br>
往NioServerSocketChannel的pipeline中添加ServerBootstrapAcceptor
ServerSocketChannel注册进boss EventLoop的selector
ServerSocketChannel绑定端口号,从tail开始触发read事件,开始接收OP_ACCEPT事件<br>
依次执行taskQueue中的任务,然后selector.select阻塞响应accept事件
接收连接
selector的read事件被响应后, <font color="#0000ff">执行NioServerSocketChannel的unsafe.read,</font>selector.selectedKeys获取selectKeys,里面attachement获取产生accept事件的ServerSocketChannel,调用accept建立SocketChannel连接,<b>创建NioSocketChannel</b>并指定SocketChannel和parent=NioServerSocketChannel, readInterestOp=OP_READ<br>
fireChannelRead事件,被ServerBootstrapAcceptor.channelRead拦截,它会<b>向NioSocketChannel的pipeline中添加在ServerBootStrap.child设置的childHandler</b><br>
向worker EventLoop的taskQueue添加任务
SocketChannel注册进worker EventLoop 的selector,接收OP_READ事件
依次执行taskQueue中的任务,然后selector.select阻塞响应read事件
读取数据
selector的read事件被响应后,<font color="#0000ff">执行触发NioSocketChannel的unsafe.read, </font><font color="#000000">fireChannelRead事件,被用户自定义的channelHandler.channelRead拦截到</font><br>
其他说明
unsafe.read时,由于NioServerSocketChannel继承了AbstractNioMessageChannel,NioSocketChannel继承了AbstractNioByteChannel,所以行为不同,前者read是serversocketchannel.accept建立连接,后者是socketchannel.read读取数据<br>
channelHandler的添加和移除:调用pipeline的addXX方法时,会调用channelhandler.handlerAdded方法,而ChannelInitializer的handlerAdded会调initChannel完成用户自定义channel的添加,并把自身移除<br>
自由主题
0 条评论
下一页