最近系统学习了一下netty,netty的框架着实让我上瘾,但是只是系统学习,不深入研究开发的时候也会碰到好多意想不到的问题,无从下手。
学习完netty框架 或者说TCP通讯以后数据传输中粘包问题。至于为什么出现粘包问题这里就不再陈述,能看到这篇博客应该是已经知道原因的。
疑问与答案
相信好多小伙伴都会有这样的问题,不如我使用了某种协议再netty中做开发,比如google的protobuf 或者websocket等等。。我还用不用再去处理粘包问题?
或者说粘包问题底层到底是怎么工作的?有这两个问题或者疑惑的我应该不是第一个也不是最后一个。今天咱们就研究一下。
答案一
自定义解码器或者可以说是一个简单的处理粘包问题的Handler。或不多说直接上代码,解释都在注释里边。
自定义解码器(处理粘包问题)
package nettytest;
import java.util.List;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import io.netty.handler.codec.TooLongFrameException;
public class FrameChunkDecoder extends ByteToMessageDecoder {
/**
* 处理半粘包问题
* 如果固定每次读取2个 判断如果够2个就通知下一个handler去处理
* 如果 不够return 这里是等待下一个数据报 然后再去处理
* 假如 第一次发送 5个字节 那么他只会读 4个 剩下1个会等到下一个数据报来了再去读
*/
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
// 每次读取两个
if(in.readableBytes()<2) {
//本人测试这里return 跟不return 效果是一样的数据再缓冲区 ByteBuf中不会丢失
// return ;
}else {
ByteBuf buf = in.readBytes(2);
System.out.println("读了"<