面试官:什么是Netty粘包拆包?怎么解决Netty粘包拆包问题

2年前 (2022) 程序员胖胖胖虎阿
175 0 0

哈喽!大家好,我是小奇,一位热爱分享的程序员
小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧
文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】更有我为大家准备的福利哟!回复【项目】有我为大家准备的一些项目源码。回复【简历模板】有我为大家准备的简历模板。

文章目录

  • 一、前言
  • 二、面试
  • 三、总结

一、前言

书接上回,昨天肯定是狗蛋通风报信,导致大爷们那么神秘的下象棋基地也被大妈捣毁了,今天肯定去下不了象棋了。

那我今天趁着天气好去地里干活吧,找不到工作就先下地干活吧,来到地里看见隔壁小丽姐跟他妈在地里正干活呢。

面试官:什么是Netty粘包拆包?怎么解决Netty粘包拆包问题

我:小丽姐,你怎么穿成这样就下地干活来了,你这样让别人还怎么干活?

小丽姐:我这还算正常的,你去东边地里看看你小娜姐,她穿黑丝就来掰棒子了。

我:不是吧,现在种地也这么卷了吗?我还就不信了,我偏去看看。

面试官:什么是Netty粘包拆包?怎么解决Netty粘包拆包问题

我:小娜姐,刚刚小丽姐说你穿黑丝来干活我还不信,现在看来真的是我落后了吗?怎么掰个棒子也这么卷。

小娜姐:没办法呀,以前都正常穿什么事情没有,现在有人开始不好好穿了,都开始了,我也不想卷,但是你不穿哪有男人来帮你干活呀。

我:领教了,终究还是我太年轻。。。我还是去看看张大婶活干的怎么样了,还想跟她借铁锹呢。

面试官:什么是Netty粘包拆包?怎么解决Netty粘包拆包问题

我:张大婶,活快干好了吗,借我用用铁锹呗。

张大婶:你整天就知道美女美女的,还用种地啊。

我:没办法嘛,现在形势不太好,只能弄一下这一亩三分地了。

正当我跟张大婶谈天说地的时候,我的电话响了。

我:“喂您好”。

对面:“您好,请问是小奇吗”。

我:“是我,你是?”。

对面:“我是XXX公司的,我看到hr推给我你的简历,我感觉还不错,你什么时候方便来现场面试一下”。

我:“现在不方便现场面试了”。

对面:“好吧,那你现在方便吗?我们现在线上面试一下吧”。

我:“好的”。

二、面试

面试官:我看你简历上写的精通Netty,那你能简单说什么是粘包和拆包吗?

我:粘包和拆包是在进行TCP数据传输的时候所造成的一种现象。

因为TCP是一个流协议,他发送的数据是一个没有界限的长串的二进制数据,TCP在发送数据之前会将数据放入缓存区。

如果缓存区没有满,就会把多个数据都放入缓存区,然后共同发送出去,这就叫粘包。

如果一条数据缓存区就放不下,那么就需要将数据分为多次发送出去,这就叫拆包。

面试官:那我不能客户端发送一条数据就传过去一条数据吗?

我:不可以,客户端属于上层协议,比如我们输入一个张三,他最终会通过底层协议TCP来发送,TCP不管你上层发了几次,它只管自己的缓存区有没有满,满了就发送。

所以如果你客户端发送两个人的姓名,例如第一次发送“张三”,第二次发送“李四”。但是通过TCP这里发生粘包,最终到达服务端那里接收的只有一条消息就是“张三李四”。

面试官:嗯。那我们有什么好的解决方式吗?

我:一般有如下几种解决方式

1:消息定长度:将传输的数据大小固定长度,比如我们固定长度为100个字节,当我们发送“张三”的时候我们就要把不够的空位空格补齐,这样就直接发送出去了,不会粘包了。

2:特殊符号分割:我们用一些特殊符号,比如下划线等来将消息之间分割来开,服务端接收到消息后遇到分隔符就知道是下一条数据了,但是这个分隔符注意一定不要在发送的数据中也有,这样会造成数据不完整。

3:发送长度:每次发送一条数据就将这条数据的长度一并发送,例如可以使用消息头来存储长度,消息体来发送真正的数据,这样服务端可以根据长度来判断数据是否接收完毕。

这个时候如果我们确定了使用哪种方式解决后我们就可以使用对应的解码器了。

回车换行分包解码器:LineBasedFrameDecoder

特殊分隔符分包解码器:DelimiterBasedFrameDecoder

固定长度报文分包解码器:FixedLengthFrameDecoder

面试官:“小伙子不错呀,什么时候能回北京入职呢”

我:“额。。。等等吧,现在还有好多家公司等着谈薪资呢,我得挑一家合适的。”

面试官:“你要多少我都给你,来我这吧”

我:“额。。。那就月薪100个W吧”。

面试官:“喂,你说什么我听不见,信号不好。。。”

我:“喂喂喂”(嘟嘟嘟嘟嘟嘟嘟嘟。。。)。

三、总结

这里的相关内容还没有整理完毕,文章后面持续更新,建议收藏。

文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。

如果觉得我的文章还不错的话就点个赞吧,另外可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】更有我为大家准备的福利哟!回复【项目】有我为大家准备的一些项目源码。回复【简历模板】有我为大家准备的简历模板。

相关文章

暂无评论

暂无评论...