交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
第3 章:NioServerSocketChannel
分享
未结
0
887
李延
LV6
2021-11-24
悬赏:20积分
# 1 背景 在NioEventLoop中,无论是注册register方法还是数据读取的read方法都是通过AbstractNioChannel.NioUnsafe来实现的,所以我们来看一下这个类具体的实现。 # 2 继承关系  这里的Channel是netty定义的接口,而不是java中的channel。我们依次分析 # 3 实现类 ## 3.1 DefaultAttributeMap 对于AttributeMap的默认实现,就是一个用于保存对象的容器,通过成员变量:`ATTRIBUTES_UPDATER`实现 ## 3.2 AbstractChannel 这里我们需要关注的几个成员变量: ```java private final Unsafe unsafe; private final DefaultChannelPipeline pipeline; ``` 其中unasfe留给子类创建 ```java protected abstract AbstractUnsafe newUnsafe(); ``` 而pipeline 是直接new出来的 ```java protected DefaultChannelPipeline newChannelPipeline() { return new DefaultChannelPipeline(this); } ``` 这些我们后面再分析 ## 3.2 AbstractNioChannel 这个类已经是与nio相关的类了我们可以看到和nio相关的操作 ```java private final SelectableChannel ch; protected final int readInterestOp; volatile SelectionKey selectionKey; protected AbstractNioChannel(Channel parent, SelectableChannel ch, int readInterestOp) { super(parent); this.ch = ch; this.readInterestOp = readInterestOp; try { ch.configureBlocking(false); } catch (IOException e) { try { ch.close(); } catch (IOException e2) { logger.warn( "Failed to close a partially initialized socket.", e2); } throw new ChannelException("Failed to enter non-blocking mode.", e); } } ``` 这里我们就看到netty的channel中是持有java的channel的,而且可以通过方法获取 ```java protected SelectableChannel javaChannel() { return ch; } ``` ## 3.3 AbstractNioMessageChannel 这里主要是对于Unsafe实现,我们可以看到子类NioMessageUnsafe中实现了read的方法。 # 3.4 NioServerSocketChannel 对于server方法的具体实现 # 4 NioSocketChannel  我们看到前面基本一致,只是最后不同,也就是说主要的不同在于对Unasfe的实现。
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号