当前位置: 首页 > 后端技术 > Java

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

时间:2023-04-01 21:31:20 Java

您好!大家好,我是小七,一个爱分享的程序员。小七打算在轻松幽默的对话中分享一些技术。如果你觉得通过小七的文章有所收获,那就给小七点赞吧。持续更新,可以微信搜索【小七JAVA专访】第一时间阅读,回复【资讯】我已经为你准备好了福利!回复【项目】有一些项目源码我给大家准备好了。回复【简历模板】我有一份简历模板给你。1.前言接上一章。肯定是昨天狗蛋泄露了,导致叔叔神秘的象棋基地被阿姨给毁掉了。今天肯定下不了棋了。那今天就让我趁着好天气去外地干活吧。如果找不到工作,我会先去外地打工。来到地里,看到小丽小姐和妈妈正在地里干活。我:小丽姐,你怎么穿成这样来下地干活,怎么能让别人这样干活?小丽姊妹:我很正常。去东田看你妹妹小娜。她身穿黑丝,前来断杖。我:不是,现在种地都是这样吗?我还是不信,就去看看。我:小娜小姐,刚才小丽小姐说你穿黑丝上班,我还是不信。现在看来,我真的落后了?一根棍子怎么断也是这么卷。小娜姐:没办法。我以前是正常穿的。现在有些人佩戴不当。我不想蜷缩起来。可你不穿,哪有男人帮你?我:学过,毕竟我太年轻了。..我还是去看看张阿姨怎么样,想跟她借一把铲子。我:张阿姨,快忙完了吗,借我一把铲子。张阿姨:成天认识美女,还要种田。我:没办法,现在情况不太好,只能得到这三分之一亩地。正当我和张阿姨聊天的时候,我的手机响了。我:“你好”。对面:“你好,请问是小七吗?”我:“是我,你呢?”。对面:“我是XXX公司的,看到hr给我推了你的简历,感觉还不错,你什么时候方便过来现场面试。”我:“现在不方便现场面试。”对面:“好的,你现在方便吗?我们现在进行在线面试。”我:“好的”。2.面试面试官:我看你简历上写的是精通Netty,那你能简单说一下什么是贴和拆包吗?我:粘包和拆包是TCP数据传输过程中产生的现象。因为TCP是流式协议,它发送的数据是一长串无边界的二进制数据,TCP在发送数据之前会将数据放入缓冲区。如果缓冲区未满,则会将多个数据放入缓冲区并一起发送出去,称为粘包。如果一个数据缓存不下,那么就需要分批发送出去,也就是拆包。面试官:那我不能在client发数据的时候发一个数据吗?我:不是,客户端属于上层协议。比如我们输入张三,他最终会通过底层协议TCP发送出去。TCP不关心你从上层发送了多少次。它只关心它的缓冲区是否已满。发送。所以如果你的客户端发送两个人的名字,比如第一次发送“张三”,第二次发送“李四”。但是这里通过TCP出现了粘包,服务器端只收到一条消息,就是“张三李四”。面试官:嗯。那我们有什么好的解决办法吗?我:一般有以下几种解决方案1:消息定长:传输数据的大小是固定长度的,比如我们固定长度为100字节,当我们发送“张三”时,我们必须空白不足的地方补上,这样就不用贴包裹直接发了。2:特殊符号分割:我们使用一些特殊的符号,比如下划线,来分隔消息。服务端收到报文后,遇到分隔符就会知道是下一条数据,但是这个分隔符一定不能在发送的数据中也有,这样会造成数据不完整。3:发送长度:每次发送一条数据时,一起发送数据的长度,比如可以用消息头存放长度,消息体发送真正的数据,这样服务器就可以根据长度判断是否接收到数据。这时候如果我们确定使用哪种方法来解决,就可以使用对应的解码器。回车换行数据包解码器:LineBasedFrameDecoder专用分隔符数据包解码器:DelimiterBasedFrameDecoder定长数据包数据包解码器:FixedLengthFrameDecoder面试官:“小伙子不错,我什么时候可以回北京打工?”我:“呃……等一下,还有很多公司等着谈薪水,我得挑一个合适的。”采访者:“你想要多少我都给你,来找我。”我:“呃……那就月薪100W吧。”面试官:“喂,我听不见你在说什么,信号不好……”我:“喂,你好”(哔哔哔哔哔哔...)。3.总结这里的相关内容没有整理,后面会继续更新文章,建议收藏。文中涉及的命令必须像我一样多敲几次。只有在敲打的过程中,才能发现自己是否真正掌握了命令。如果觉得我的文章还不错,请点个赞。另外可以微信搜索【小七JAVA专访】第一时间阅读,回复【资讯】我已经为你准备好了福利!回复【项目】有一些项目源码我给大家准备好了。回复【简历模板】我有一份简历模板给你。