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