Netty

TCP粘包/拆包

应用程序写入字节大于Socket缓冲区大小就会触发拆包操作。
TCP是一种流协议,他无法理解上层发来的字节含义,只根据自身容量就行拆分、组合操作。

Netty是如何解决TCP粘包问题的

  • 粘包/拆包问题复现

client端发送100次消息
client端

server端接收消息并使用一个AtomicInteger计算接收次数
server端
以上代码如果没有发生粘包/拆包问题的话AtomicInteger计算的结果应该为客户端调用writeAndFlush()方法的次数

实际运行结果
result
可以很明显看见发生了粘包/拆包现象

  • 处理此类问题的方案
  1. 消息定长,空位补空格。
  2. 包尾添加切割符号。
  3. 消息拆分为消息头和消息尾,在消息头规定长度标识消息长度。
  • Netty使用LineBasedFrameDecoder和StringDecoder处理粘包/拆包问题
    LineBasedFrameDecoder : 原理就是顺序扫描字节流,直到遇到"\n" 或 "\r\n"就以此为结束位置,将其组成一行。如果到达设置的最大字节没扫到就报错。
    StringDecoder: 将字节转换为String
posted @   ccme  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示