粘包、拆包到底是不是真的?这篇先用纯 JDK 的 socket 量出 TCP 的字节流行为,再用 Netty 4.1 的三种帧解码器恢复消息边界(Selector 的工作方式见上一篇)。
发送方写了 2000 次、每次 50 字节(共 100000 字节);接收方 read() 了 855 次,共 100000 字节;平均每次读到 116 字节 每次 read 读到的字节数不是 50 的整数倍的次数:0 / 855(消息被拦腰截断) 换成每条 20000 字节、写 100 条(共 2,000,000 字节),接收方用 200000 字节的缓冲区:read() 58 次,其中读到的字节数不是 20000 的整数倍的有 34 次(这些读取里有被截断的消息) 发送方一次 write 1,000,000 字节,接收方用 1 MB 的缓冲区读,read() 了 13 次才收完 1000000 字节
发送方写了 2000 条消息;服务端 channelRead 被调用 50 次,收到 100000 字节,每次的大小最小 150、最大 32768
发送方写了 2000 条消息;服务端 channelRead 被调用 2000 次,收到 92000 字节,每次的大小最小 46、最大 46;解码出 2000 条完整消息,内容校验失败 0 条
发送方写了 2000 条消息;服务端 channelRead 被调用 2000 次,收到 96000 字节,每次的大小最小 48、最大 48;解码出 2000 条完整消息,内容校验失败 0 条 [Fixed] 发送方写了 2000 条消息;服务端 channelRead 被调用 2000 次,收到 100000 字节,每次的大小最小 50、最大 50;解码出 2000 条完整消息