9-4 中关于注册时把 IoArgs 一同注册的缺点

来源:9-4 文件消息模型基础实现-2

磊磊要酷酷滴

2019-05-03

  • 老师在课程中说:注册时连同 IoArgs 一起注册,意味着已经把通道打开了,这是为什么呢?
  • IoArgs 只是被传入 SocketChannelAdapter#outputCallbackattach 中,然后 outputCallback 存入 IoSelectorProvider#inputCallbackMap 中,为什么就会使通道打开了呢?
  • 截图如下:
    图片描述
写回答

2回答

Qiujuer

2019-05-03

理论来说:SocketChannelAdapter 存在了那么Socket连接就已经建立好了。

到达IoSelectorProvider的时候已经进入到传输部分了,一旦IoSelectorProvider调度IoArgs的时候那么此时通道就已经就绪了。


不知道这是不是你要的答案,如果不是,麻烦你截图一下哈;我也怕理解错了你的点。

0
4
磊磊要酷酷滴
非常感谢!
2019-05-03
共4条回复

none_nkn

2020-06-25

老师在课程中说:注册时连同 IoArgs 一起注册,意味着已经把通道打开了?

对于老师这句话我的理解是:通道指的是ReadableChannel或WritableChannel。即发送数据时连同IoArgs一起注册的话,则先需要打开一个ReadableChannel,使用args.readFrom(ReadableChannel channel)将数据读入IoArgs后再去注册。这样的流程可以描述为:【准备数据(打开通道)-->注册事件-->事件就绪-->处理数据】,即事件未就绪前就打开输入通道了。老师后面又说把打开通道延迟到事件就绪后,实际流程调整为:【注册事件-->事件就绪-->准备数据(打开通道)-->处理数据】。这样的理解如有不妥,期望一起交流喔。

0
1
Qiujuer
通道其实是一直打开的,只是在于什么时候使用而已。比如读取通道,你可以在事件未就绪的时候也去读取,但是此时读取不了数据,只是浪费CPU的空转。 关于写通道也是一样,如果没有就绪时去做输出操作也是可以的,但是当计算机的网卡和内存之间的缓冲满载时,可能会输出直接阻塞。
2020-06-28
共1条回复

Socket网络编程进阶与实战 系统掌握Socket核心技术

理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选

2324 学习 · 476 问题

查看课程