请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

NIO相关问题

1、老师,按照你前面讲的原理,我觉得selector一次只选择0个或1个key,那么为什么selectedKeys方法的结果用set数组表示?仅仅是为了方便用iterator吗?
2、key等于OP_ACCEPT时register函数注册的selector和key等于OP_READ时register函数注册的selector是否是同一个?
3、而且从代码来看,if(key.isAcceptable())和if (key.isReadable())代码块里的channel还不是一个channel,有点不懂

正在回答

1回答

第一个问题,你的理解是对的,但不是为了方便。这个设计的确比较怪,是为了和几十年历史的unix select函数的行为保持一些一致。
对于2和3。这是同一个selector,但是挂了很多channel。一个用来accept新的链接,然后每个链接又有对应的op_read的channel注册在selector里面。
主循环阻塞住,然后有新的链接,或者有新的数据,都会造成对应的key被select,然后进行对应的操作。

2 回复 有任何疑惑可以回复我~
  • 提问者 红邮筒 #1
    1、所以,只有一个selector,那么selector里面是只有一个channel用来accept链接,所有客户端链接都从这个channel被accept吗?然后每accept一个客户端,就在selector中加一个client的SocketChannel?
    2、如果是只有一个accept的channel,那么op_read的channel是所有客户端链接共用的,还是每个客户端链接对应一个op_read的channel?
    回复 有任何疑惑可以回复我~ 2018-12-14 10:50:27
  • ccmouse 回复 提问者 红邮筒 #2
    每个客户端对应一个注册为op_read的。accept的只有一个。
    回复 有任何疑惑可以回复我~ 2018-12-14 20:54:34
  • 提问者 红邮筒 #3
    非常感谢!
    回复 有任何疑惑可以回复我~ 2018-12-17 09:59:41
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信