34、Nio(selector(处理消息边界问题(附件与扩容)))

Nio(selector(处理消息边界问题(附件与扩容)))

第一步:我们确定这个ByteBuffer的具体位置

我们分析一下,其中我们不能将我们的buffer放到全局变量中去,因为这样的话就意味着我们的buffer是所有channel通道共用的(我们需要一个buufer被一个channel使用),所以我们这里用到附件(attachment)也就是我们通道注册到selector的第三个参数,这个知识,其中将buffer注册到selector因为channel也注册到我们selector,那么就是一个通道使用一个buffer了(管他读了几次)。我们获取这个buffer也就只需要从管理这个selector的key里面获取了key.attachment()

第二步:我们什么时机扩容

这里我们举个例子来分析下,我们之前的改进代码是根据\n来compact读取的(移不动了),现在是我们没有读取到\n我们也想将数据往前移动然后positon执行在读的后面(去看下compact的操作吧,蠢比),所以我们这里思考一下position(变为剩余未读的字节数)和limit的位子,若是他们这里是一样的都到了末尾。那么我们这时需要扩容

!!!(注意我们这里flip(),是因为我们前面的方法compact变为了写,所以这里我们要读)

最后这个key.attach(newBuffer),就是将这个新的去替换之前buffer里的内容咯(他们的本质还是一个buffer嘛)

测试:

猜你喜欢

转载自blog.csdn.net/logtcm4/article/details/127821069