- 1.接受消息和接受链接的逻辑类似,其是调用AbstractNioUnsafe的内部类NioByteUnsafe的read方法。首先判断根据条件判断当前数据是否需要读取,如果不需要则设置readPending=false。因为如果为true则代表当前正在等待read事件或者正在读取。
- 2.重置我们的接受缓冲的处理器RecvByteBufAllocator.Handle。
- 3.初始分配给我们1024字节大小的接受消息的bytebuf,然后我我们利用该bytebuf从我们的socketchannel获取数据。
- 4.每次统计当前获取的字节大小,如果小于等于0则跳出循环,如果读取的字节数小于0则代表channel有异常
直接关闭。 - 5.如果正常读取到数据我们会统计读取的次数totalMessages,如果读取的次数大于maxMessagePerRead则也会跳出循环。
- 6.每次读取到一部分数据都是传递给channelRead方法,所以我们需要一个handler(ByteToMessageDecoder)来帮我们累计一个完整的数据。
- 7.再整个数据读取完毕之后会分别调用ChannelReadComplete()来设置readPending=true。
- 8.最后就是如果我们的readPending=false且不是autoread则代表我们取消注册read事件,因为我们不支持自动读且当前的读已经读完了 所以不能注册read事件。
网友评论