采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
SocketChannelAdapter#outputCallback
attach
outputCallback
IoSelectorProvider#inputCallbackMap
理论来说:SocketChannelAdapter 存在了那么Socket连接就已经建立好了。到达IoSelectorProvider的时候已经进入到传输部分了,一旦IoSelectorProvider调度IoArgs的时候那么此时通道就已经就绪了。
不知道这是不是你要的答案,如果不是,麻烦你截图一下哈;我也怕理解错了你的点。
已在问题描述中加入截图,还请老师看一下。
不出意外的话 后面会讲解的,在这里还有一次优化,到时候会吧ioargs单独提出来;在这里只会注册回调,当就绪时触发回调,并进行数据处理。 对于发送来说是可以向上面的那样,我们把ioargs携带进去,此时我们先假设输出通道已就绪,我们可以直接进行一次输出操作,如果输出失败再进行注册即可,这样的发送效率可以最大化。但是经过我的测试,我发现这个并不是完全100%的可行,特别是在Mac系统下,居然直接发送操作是阻塞的,通道没有就绪不会直接返回错误,而是持续等待。
谢谢老师!
老师在课程中说:注册时连同 IoArgs 一起注册,意味着已经把通道打开了?
对于老师这句话我的理解是:通道指的是ReadableChannel或WritableChannel。即发送数据时连同IoArgs一起注册的话,则先需要打开一个ReadableChannel,使用args.readFrom(ReadableChannel channel)将数据读入IoArgs后再去注册。这样的流程可以描述为:【准备数据(打开通道)-->注册事件-->事件就绪-->处理数据】,即事件未就绪前就打开输入通道了。老师后面又说把打开通道延迟到事件就绪后,实际流程调整为:【注册事件-->事件就绪-->准备数据(打开通道)-->处理数据】。这样的理解如有不妥,期望一起交流喔。
通道其实是一直打开的,只是在于什么时候使用而已。比如读取通道,你可以在事件未就绪的时候也去读取,但是此时读取不了数据,只是浪费CPU的空转。 关于写通道也是一样,如果没有就绪时去做输出操作也是可以的,但是当计算机的网卡和内存之间的缓冲满载时,可能会输出直接阻塞。
登录后可查看更多问答,登录/注册
理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选
2.5k 1
1.6k 7
1.5k 5
1.7k 13
873 13