基础
正常流程:TCP缓存->Netty本地缓存->拆包器拆包->Handler处理封装好的数据包
测试代码:netty/demo/tcppackage
参考博文:http://www.jianshu.com/p/a0a51fd79f62
如果不设置解码器
测试流程:
- 客户端连续发送n次18字节的数据
@Override
public void channelActive(ChannelHandlerContext ctx) {
ByteBuf message = null;
//连续发送100个包 56 一次 113两次 170 收三次
for (int i = 0; i < 110; i++) {
message = Unpooled.buffer(req.length);
message.writeBytes(req);
ctx.writeAndFlush(message);
}
}
服务端在channelRead 回调函数中处理接收的数据
初始化本地缓存大小[1024] 1kb
.option(ChannelOption.SO_BACKLOG, 1024)
加断点测试:
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws UnsupportedEncodingException {
[breakpoint] ByteBuf buf = (ByteBuf) msg;
byte[] req = new byte[buf.readableBytes()];
buf.readBytes(req);
}
- 测试结果
n = 56
channelRead 只执行 1 次
buf 数据长度为: 1008
buf 容量为: 1024
n = 110
channelRead 执行 2 次
第一次
buf 数据长度为: 1024
buf 容量为: 1024
第二次
buf 数据长度为: 956
buf 容量为: 1024
- 结论
channelRead的回调次数与发送端发送的数据有关
次数 = 数据总量/本地缓存size