相信大多数人看到 channelReadComplete 都会认为这是 Netty 读取了完整的数据,然而有时却不是这样。
channelReadComplete 其实只是表明了本次从 Socket 读了数据,但是否是完整的数据它其实并不知道。
甚至在某些情况下 channelReadComplete 会先于 channelRead 被调用。
具体的代码请查看 AbstractNioByteChannel.NioByteUnsafe/AbstractNioMessageChannel.NioMessageUnsafe 中 read 函数部分。
如果想要完整的数据被读出后被回调应该如何解决?解码器 + channelRead,解码器用于把数据整合,同时在整合完成后调用 channelRead。
如果你使用的 HTTP 协议,Netty 已经帮你写好了一个解码器 HttpObjectAggregator,你只需要使用它然后就可以愉快的在 channelRead 写业务代码了。
如果你使用的其它协议或者自定义协议,那么你可能需要自己写解码器。
4 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!