UDP TCP或者串口通信中有可能会出现粘包问题。具体解决办法有以下几种
1.自定义包体格式包含包头+包体长度
2.加大读取缓冲区buffer

本文介绍第一种方法的
socket通信中我们一般开启一个线程然后死循环的读取其中的信息

我们定好协议格式如下十六进制表示
A3A4+长度两字节+json
其中A3A4为协议头 json是我们需要的具体数据

我们就可以固定的先读取4个字节获取完整包长度再继续读取

                   byte[] temBuffer = new byte[4];if (mInputStream == null) {continue;}int ret = mInputStream.read(temBuffer);if (ret > 0) {byte[] msg = null;//收到一条新命令为0XA3 0XA4开头的if (temBuffer[0] == (byte) 0xA3 && temBuffer[1] == (byte) 0xA4) {//计算命令长度 即2 3字节组合成Intint cmdSize = ConvertUtilsPlus.getIntFromBytes(temBuffer[2], temBuffer[3]);int bodyLength = 4+ cmdSize;//计算出中长度msg = new byte[bodyLength];//申明本次接收一个完整数据需要的容量int recLength = ret;//记录当前已接收数据的长度int errorCount = 0;//记录错误次数System.arraycopy(temBuffer, 0, msg, 0, recLength);//第一包无脑丢进数组中//如果本次读取到的数据小于总长度那么继续readwhile (recLength < bodyLength && errorCount < 10) {byte[] temp = new byte[bodyLength - recLength];int rec = mInputStream.read(temp);if (rec <= 0) {errorCount++;continue;}//复制读取的数据到数组中System.arraycopy(temp, 0, msg, recLength, rec);recLength += rec;}}//没有新消息继续循环if (msg == null) continue;

getIntFromBytes方法如下

  public static int getIntFromBytes(byte low_h, byte low_l) {return  (low_h & 0xff) << 8 | low_l & 0xff;}

以上方法各位多看看注释应该能理解透彻

SOCKET/串口通信粘包问题处理,附带详细代码相关推荐

  1. python/socket编程之粘包

    python/socket编程之粘包 粘包 只有TCP有粘包现象,UDP永远不会粘包. 首先需要掌握一个socket收发消息的原理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 发 ...

  2. socket编程 TCP 粘包和半包 的问题及解决办法

    socket编程 TCP 粘包和半包 的问题及解决办法 参考文章: (1)socket编程 TCP 粘包和半包 的问题及解决办法 (2)https://www.cnblogs.com/panchang ...

  3. TCP通信粘包问题分析和解决

    在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送端为了将多个发往接收端的包,更有效的 ...

  4. socket,与粘包

    1,socket(套接字) socket层 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口 server端 import socket sk = socket.socket ...

  5. Socket编程 TCP粘包问题及解决方案

    ① TCP是个流协议,它存在粘包问题 TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的.这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的.T ...

  6. Android 串口开发——粘包解决方法,定时查询心跳数据,解析心跳数据。——持续更新中

    粘包解决方法 方法1 getXOR--是校验方法 /*** 最小数据包的长度(除开数据的N个字节)* 帧头 保留字节 协议控制字 地址字段 命令长度 命令码 命令数据 校验和* 2字节 3字节 1字节 ...

  7. 什么是粘包?socket 中造成粘包的原因是什么? 粘包的处理方式

    1.粘包的概念 粘包:多个数据包被连续存储于连续的缓存中,在对数据包进行读取时由于无法确定发生方的发送边界,而采用某一估测值大小来进行数据读出,若双方的size不一致时就会使指发送方发送的若干包数据到 ...

  8. javarxtx串口接收时数据会分成好几段_【STM32】串口通信基本原理(超基础、详细版)...

    STM32F1xx官方资料: <STM32中文参考手册V10>-第25章通用同步异步收发器(USART) 通信接口背景知识 设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通 ...

  9. 【STM32】串口通信基本原理(超基础、详细版)

    STM32F1xx官方资料: <STM32中文参考手册V10>-第25章通用同步异步收发器(USART) 通信接口背景知识 设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通 ...

最新文章

  1. 用计算机怎么算个人所得税,个税计算器2021
  2. 使用MLX90640自制红外热像仪(二):API函数的使用
  3. CSS学习02之css导入方式
  4. GCC 编译时优化某一个或几个函数或者不优化某一个或几个函数
  5. 9月20日 DNS总结
  6. Android 系统(74)---Android手势触摸事件的分发和消费机制
  7. nofollow标签_网站Nofollow标签的应用场景
  8. Oracle数据库个人整理常用的表空间、用户、授权操作
  9. Ubuntu安装配置JDK、Tomcat、SVN服务器
  10. Opencv之Meanshift和Camshift
  11. 高斯克吕格投影换带计算(高斯正反算公式)
  12. android 斜线 绘制_Android绘图:绘制直线的 drawLine方法
  13. 使用python实现win10系统和arduino usb串口通信
  14. 基于 NVIDIA GPU 和 RAPIDS 加速 Spark 3.0
  15. 汉字转拼音pinyin
  16. 目标检测:SSD改进之DSSD的论文详解
  17. 2.3、JavaScript 数据类型 - 数字类型
  18. Atcoder 834 A mod B Problem 神思路取模
  19. 完美的扎克伯格,倒霉的Facebook
  20. autojs打包的软件报毒

热门文章

  1. 实现数组类(C++ 拷贝构造函数、拷贝函数)要判断赋值左右对象不相等,坑惨了...
  2. 【个人笔记】《知了堂》MySQL中的数据类型
  3. 美国远程医疗公司First Stop Health获210万天使投资
  4. flock文件锁的学习和应用
  5. mysql 只导数据不含表结构
  6. 15 sql base line 工作机制
  7. CentOS通过DNSpod实现动态域名
  8. [转载] 七龙珠第一部——第094话 太阳拳
  9. SecureCRT中Python脚本编写学习指南
  10. Python后端转JAVA最快多久_PHP多久能学会?比java,python难还是简单呢?