Netty粘包/拆包支持
来源:互联网 发布:java 23种设计模式 编辑:程序博客网 时间:2024/06/05 03:12
在之前的Netty项目中没有考虑半包的问题。一旦压力上来或者发送大的报文就会存在粘包拆包问题。
使用LineBansedFrameDecode解决TCP粘包问题。
直接在调用Handler之前添加LineBasedFrameDecoder和StringDecoder两个解码器即可。
protected void initChannel(SocketChannel arg0) throws Exception { arg0.pipeline().addLast(new LineBasedFrameDecoder(1024)); arg0.pipeline().addLast(new StringDecoder()); arg0.pipeline().addLast(new TimeServerHandler()); }
LineBasedFrameDecoder的工作原理是依次遍历ByteBuf中可读字节,判断是否有“\n”或“\rn”,如果有就为结束位。它是以换行符为结束标示的解码器。
StringDecoder的功能是将接收到的对象装换成字符串。如果使用StringDecoder在channelRead方法中就可以使用String body = (String)msg
,直接将传输对象转换成String型。LineBasedFrameDecoder+StirngDecoder组合就是按行切换的文本解码器。
分隔符解码器:
使用方式和上面的基本类似
@Overrideprotected void initChannel(SocketChannel socketChannel) throws Exception { ByteBuf delimiter = Unpooled.copiedBuffer("$_".getBytes()); socketChannel.pipeline().addLast(new DelimiterBasedFrameDecoder(1024, delimiter)); socketChannel.pipeline().addLast(new StringDecoder()); socketChannel.pipeline().addLast(new EchoServerHandler());}
创建以“$_”作为分隔符的缓冲对象。创建DelimiterBasedFrameDecoder对象,参数“1024”表示单条消息的最大长度,如果到达该最长度仍然没有查到分隔符,就抛异常。
固定长度解码器:
@Overrideprotected void initChannel(SocketChannel socketChannel) throws Exception { socketChannel.pipeline().addLast(new FixedLengthFrameDecoder(20)); socketChannel.pipeline().addLast(new StringDecoder()); socketChannel.pipeline().addLast(new EchoServerHandler());}
利用FixedLengthFrameDecoder解码器,无论一次收到多少数据报,他都会按照构造函数中的固定长度进行解码。
阅读全文
1 0
- Netty粘包/拆包支持
- Netty -- TCP粘包/拆包
- netty拆包/粘包的解决方案
- Netty 粘包、拆包解决示例
- Netty:模拟粘包
- Netty 粘包
- Netty初探-解决TCP粘包/拆包问题
- Netty权威指南之TCP粘包和拆包
- Netty学习之TCP粘包/拆包
- Netty的入门-拆包和粘包的处理
- Netty中处理TCP粘包和拆包
- 聊一聊Netty TCP粘包/拆包问题的解决办法
- Netty (三) TCP粘包和拆包解决方案
- Netty学习10-粘包和拆包
- Netty实践(二):TCP拆包、粘包问题
- Netty自定义协议的粘包和拆包处理
- Netty学习(四)-TCP粘包和拆包
- netty学习笔记(2)_tcp拆包/粘包问题
- java.net.UnknownHostException异常
- Linux实现音频录放
- npm 模块安装机制简介
- ES6中的箭头函数
- setjmp.h signal.h assert.h的用法
- Netty粘包/拆包支持
- Groovy 基本类型
- Kubernetes集群搭建【草稿】
- 王爽 《汇编语言》 读书笔记 二 寄存器
- 贪心算法——(1)
- halocn读取本地文件
- 存储过程
- 文件头
- 数据传输加密非对称加密算法以及对称算法-RSA+AES