channelReadComplete
从字面看就是netty读取完数据之后要进行的操作,然而有时却并不是这样。
对于channelRead
方法,如果pipeline中添加了解析器,会在消息被解码后才会被调用;而channelReadComplete
方法是只要底层的socket读到了bytes就会被触发一次,但是否是完整的数据它并不知道。
底层的TCP不会去理解上层的业务数据,只会根据缓冲区的实际情况进行数据包的拆分或重组,所以对于一个完整的业务信息,就可能会多次调用channelReadComplete
。
那么只能通过上层应用协议来保证数据包的完整性,如果是自定义协议,那么需要自己写解码器。如果使用的 HTTP 协议,Netty 已经帮写好了解码器加聚合器 HttpObjectAggregator
。
需要注意的点:
- 在有解码器的情况下,收到的消息如果没有指定的结束标记,是不会执行
channelRead
的。 - HTTP解码器配合上聚合器,聚合器的长度设置合适很重要,否则数据被丢弃就不会执行
channelRead()
。
HttpObjectAggregator
源码:
构造器