博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用 LineBasedFrameDecoder 和 StringDecoder 解决半包粘包问题
阅读量:6761 次
发布时间:2019-06-26

本文共 2196 字,大约阅读时间需要 7 分钟。

修改之前的 代码, 修改为下面代码

public class TimeServer {    public void bind(int port) throws Exception {        EventLoopGroup bossGroup = new NioEventLoopGroup();        EventLoopGroup workerGroup = new NioEventLoopGroup();        try {            ServerBootstrap b = new ServerBootstrap();            b.group(bossGroup, workerGroup)                    .channel(NioServerSocketChannel.class)                    .option(ChannelOption.SO_BACKLOG, 1024)                    .childHandler(new ChildChannelHandler());            // 绑定端口, 同步等待成功            ChannelFuture f = b.bind(port).sync();            // 等待服务端监听端口关闭            f.channel().closeFuture().sync();        } finally {            bossGroup.shutdownGracefully();            workerGroup.shutdownGracefully();        }    }    private class ChildChannelHandler extends ChannelInitializer
{ @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new LineBasedFrameDecoder(1024)); ch.pipeline().addLast(new StringDecoder()); ch.pipeline().addLast(new TimeServerHandler()); } } private class TimeServerHandler extends ChannelHandlerAdapter { @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { ctx.close(); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { String body = (String) msg; System.out.println(body); ByteBuf resp = Unpooled.copiedBuffer("6666".getBytes()); ctx.write(resp); } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { ctx.flush(); } }}

主要修改了 initChannelchannelRead 方法.

LineBasedFrameDecoder 和 StringDecoder 原理分析

LineBasedFrameDecoder 的工作原理是它依次遍历 ByteBuf 中的可读字节, 判断看是否有 \n\r\n, 如果有, 就以此位置为结束位置, 从可读索引到结束位置区间的字节就组成了一行.

它是以换行符为结束标志的解码器, 支持携带结束符或者不携带结束符两种解码方式, 同时支持配置单行的最大长度. 如果连续读取到最大长度后仍然没有发现换行符, 就会抛出异常, 同时忽略之前读到的异常码流.

StringDecoder 的功能非常简单, 就是将收到的对象转换成字符串, 然后继续调用后面Handler.

LineBasedFrameDecoder + StringDecoder 组合就是按行切换的文本解码器, 它被设计用来支持 TCP 的粘包和拆包.

转载地址:http://flbeo.baihongyu.com/

你可能感兴趣的文章
双十一你想要的,我们提前给你备好了——七牛云产品0.1元起购
查看>>
SQL老司机,在SQL中计算 array & map & json数据
查看>>
绘制图片
查看>>
leetCode 13 Roman to Integer
查看>>
SpringBoot高级篇Redis之Hash数据结构使用姿势
查看>>
javaScript设计模式:Observer(观察者)模式实践(一)
查看>>
介绍两个好玩的和Github相关的Chrome扩展
查看>>
PC浏览器播放HLS协议的视频
查看>>
函数计算性能福利篇(二) —— 业务冷启动优化
查看>>
Python学习之路25-使用一等函数实现设计模式
查看>>
Swift3中的 Method Swizzling
查看>>
交互式数据可视化-D3.js(二)选择集和数据
查看>>
Logan:美团点评的开源移动端基础日志库
查看>>
怎样给一个Vue页面添加大纲导航
查看>>
ElementUI的Table组件中的renderHeader方法研究
查看>>
Apache Rewrite
查看>>
深入K8S Job(一):介绍
查看>>
generic netlink 编程快速入门
查看>>
JavaScript 编码规范
查看>>
H5页面二次分享
查看>>