前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Netty】02-netty中不得不说的粘包与拆包

【Netty】02-netty中不得不说的粘包与拆包

作者头像
envoke
发布2020-09-17 11:31:12
6010
发布2020-09-17 11:31:12
举报

netty不得不说的粘包与拆包

为什么会出现粘包和拆包的现象呢?

第一个要素为长连接,一个长连接可以发送多个消息

第二个要素为缓冲区。当我们采用了缓冲区以后,缓冲区会有固定大小,当发送的数据和缓冲区的大小不一致时,就会发生粘包和拆包。我们可以理解为:当缓冲区的大小被装满时,才会写入到硬盘

缓冲区

提到粘包与拆包,我们需要先做一些铺垫,了解一下缓冲区的作用

我们先来看一张图解:

在这里插入图片描述
在这里插入图片描述

Client发送数据,如果没有缓冲区,采用的是IO流。IO流传输是按照字节进行传输的,效率极低。当我们改为缓冲区以后,我们可以把消息存到一起,一并发送

比如说:“今天你过的还好吗”这样一组字符串要传输8次,效率就很低,所以,我们采用Buffer缓冲区进行传输,统一放入缓冲区内,再一次性写入。效率就提高了

粘包与拆包图解

粘包:

在这里插入图片描述
在这里插入图片描述

我们第一次发送的数据只有512,不够缓冲区大小,所以缓冲区不会进行写入操作,当我们发送第二次数据又有512,两次加起来刚好满足缓冲区大小,则进行写入操作。即为粘包操作

在这里插入图片描述
在这里插入图片描述

当我们发送的数据大于缓冲区的大小,缓冲区装不下了,所以会分成两次写入,所以,拆包也就随之发生了

如何解决粘包和拆包问题
  1. 以固定的长度发送数据,到缓冲区(rpc远程调用,长度不能固定) 采用/n来做分割,读取的时候,把获取的消息按照\n分割
  2. 添加分隔符(\n或者\r\n)
  3. 添加编码器和解码器的方式来做(常用),也可以自定义编码器和解码器
代码语言:javascript
复制
ch.pipeline().addLast(new LineBasedFrameDecoder(1024));
ch.pipeline().addLast(new StringEncoder());
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • netty不得不说的粘包与拆包
    • 为什么会出现粘包和拆包的现象呢?
      • 缓冲区
        • 粘包与拆包图解
          • 如何解决粘包和拆包问题
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档