TCP是以流的方式来处理数据,一个完整的数据包可能会被TCP拆分成多个包进行发送,也可能把多个小的包封装成一个大的数据包。由于TCP数据包之间没有边界保护,所以当发生粘包或拆包时,接收端难以从数据流中准确获取数据。

TCP粘包/分包的原因:

应用程序写入的字节大小大于套接字发送缓冲区的大小,会发生拆包现象,而应用程序写入数据小于套接字缓冲区大小,网卡将应用程序多次写入的数据封装成一个数据包发送到网络上,这将会发生粘包现象。

解决方法:

netty提供了3种类型的解码器对TCP 粘包/拆包问题进行处理:

定长消息解码器:FixedLengthFrameDecoder。发送方和接收方规定一个固定的消息长度,不够用空格等字符补全,这样接收方每次从接受到的字节流中读取固定长度的字节即可,长度不够就保留本次接受的数据,再在下一个字节流中获取剩下数量的字节数据。
分隔符解码器:LineBasedFrameDecoder或DelimiterBasedFrameDecoder。LineBasedFrameDecoder是行分隔符解码器,分隔符为\n或\r\n;DelimiterBasedFrameDecoder是自定义分隔符解码器,可以定义一个或多个分隔符。接收端在收到的字节流中查找分隔符,然后返回分隔符之前的数据,没找到就继续从下一个字节流中查找。
数据长度解码器:LengthFieldBasedFrameDecoder。将发送的消息分为header和body,header存储消息的长度(字节数),body是发送的消息的内容。同时发送方和接收方要协商好这个header的字节数,因为int能表示长度,long也能表示长度。接收方首先从字节流中读取前n(header的字节数)个字节(header),然后根据长度读取等量的字节,不够就从下一个数据流中查找。

最新文章

  1. 如何搭建开源code review gerrit服务器
  2. uart启示2_异步操作的bug
  3. JS转换HTML转义符
  4. robot framework 安装配置
  5. NGUI Camera's raycast hit through the UI Layer issue
  6. 爬虫技术 -- 进阶学习(九)使用HtmlAgilityPack获取页面链接(附c#代码及插件下载)
  7. centos7开机/etc/rc.local不执行的问题
  8. Hot OS'15 summary
  9. Lambda前世今生
  10. python邮件发送接收
  11. docker 创建本地镜像服务器
  12. httpcomponents-client-4.3.x DOC
  13. cocos2d-x物业现场
  14. POJ 2234 Matches Game 尼姆博弈
  15. sqlserver 简单的创建数据库
  16. dp-棋盘形dp
  17. VisualStudio移动开发(C#、VB.NET)Smobiler开发平台——VoiceRecorder控件的使用方式.Net移动开发
  18. 使用opencv进行简单的手势检测[by Python]
  19. kettle并行运行时出现「Unknown error in KarafBlueprintWatcher」
  20. Oracle 查询字段不包含多个字符串方法

热门文章

  1. 将 ChatGPT 接入 Zabbix 为告警提供修复建议(对接钉钉)
  2. js中常用Math对象
  3. vue 从后往前循环数组的简洁写法
  4. JS学习-Web Workers API接口
  5. CSS3图片自适应各种尺寸的屏幕
  6. centos 换源
  7. JetCache源码整理
  8. 【Java】自定义mybatis
  9. Win上好用的App们
  10. flink sql任务出现java.lang.OutOfMemoryError: Metaspace