Netty使用解码器Decoder解决TCP粘包和拆包问题
2019-07-19 21:36
1511 查看
解码器Decoder和ChannelHandler的关系
netty的解码器通常是继承自ByteToMessageDecoder,而它又是继承自ChannelInboundHandlerAdapter,其实也是一种ChannelHandler和我们自定义的ChannelHandler一样都是来处理进入或者出去的数据。常用的几种解码器有:
- LineBasedFrameDecoder
- DelimiterBasedFrameDecoder
- FixedLengthFrameDecoder
LineBasedFrameDecoder
LineBasedFrameDecoder 行解码器,遍历ByteBuf中的可读字节,按行(\n \r\n)处理
StringDecoder
StringDecoder将接受的码流转换为字符串
代码中使用
@Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); //LineBasedFrameDecoder遍历ByteBuf中的可读字节,按行(\n \r\n)处理 pipeline.addLast(new LineBasedFrameDecoder(1024)); //StringDecoder将接受的码流转换为字符串 pipeline.addLast(new StringDecoder()); pipeline.addLast(new NettyServerHandler()); }
NettyServerHandler处理类中读取,String message = (String) msg;直接转换为String:
private int count = 0; @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { String message = (String) msg; LOGGER.info("client received message {}:{}", ++count, message); }
DelimiterBasedFrameDecoder
DelimiterBasedFrameDecoder,将特定分隔符作为码流结束标志的解码器。
代码中使用
@Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); ByteBuf byteBuf = Unpooled.copiedBuffer("$_".getBytes()); pipeline.addLast(new DelimiterBasedFrameDecoder(1024,true,true,byteBuf)); pipeline.addLast(new StringDecoder()); pipeline.addLast(new NettyServerHandler()); }
FixedLengthFrameDecoder
FixedLengthFrameDecoder 固定长度解码器,只会读取指定长度的码流。
代码中使用
@Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new FixedLengthFrameDecoder(24)); pipeline.addLast(new StringDecoder()); pipeline.addLast(new NettyServerHandler()); }
相关文章推荐
- Netty5中使用LineBasedFrameDecoder解决TCP粘包问题
- Netty使用LineBasedFrameDecoder解决粘包问题
- netty 解决TCP粘包与拆包问题(一)
- TCP粘包/拆包--利用LineBasedFrameDecoder解决TCP粘包问题
- Netty解决TCP粘包/拆包问题 - 按行分隔字符串解码器
- 4、netty之解决tcp粘包问题(netty学习笔记)
- java netty使用DelimiterBasedFrameDecoder处理tcp粘包问题
- netty 过长内容分成了多次发送 问题 LengthFieldBasedFrameDecoder使用
- TCP粘包/拆包--利用DelimiterBasedFrameDecoder解决TCP粘包问题
- Netty学习之固定长度解码器解决TCP粘包
- netty 解决TCP粘包与拆包问题(二)
- 《netty权威指南》4.3利用LineBasedFrameDecoder解决TCP粘包问题
- netty 解决TCP粘包与拆包问题(三)
- 利用LineBasedFrameDecoder解决TCP粘包问题
- TCP粘包/拆包--利用FixedLengthFrameDecoder解决TCP粘包问题
- netty(一) 利用 LineBasedFrameDecoder,StringDecoder解决TCP粘包/拆包问题
- netty 解决TCP粘包与拆包问题(一)
- Netty入门系列(2) --使用Netty解决粘包和拆包问题
- Netty解决TCP粘包和拆包问题的四种方案
- Netty 4.x + Java8 无法使用 lambda表达式问题的解决方法