SOCKET/串口通信粘包问题处理,附带详细代码
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/串口通信粘包问题处理,附带详细代码相关推荐
- python/socket编程之粘包
python/socket编程之粘包 粘包 只有TCP有粘包现象,UDP永远不会粘包. 首先需要掌握一个socket收发消息的原理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 发 ...
- socket编程 TCP 粘包和半包 的问题及解决办法
socket编程 TCP 粘包和半包 的问题及解决办法 参考文章: (1)socket编程 TCP 粘包和半包 的问题及解决办法 (2)https://www.cnblogs.com/panchang ...
- TCP通信粘包问题分析和解决
在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送端为了将多个发往接收端的包,更有效的 ...
- socket,与粘包
1,socket(套接字) socket层 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口 server端 import socket sk = socket.socket ...
- Socket编程 TCP粘包问题及解决方案
① TCP是个流协议,它存在粘包问题 TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的.这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的.T ...
- Android 串口开发——粘包解决方法,定时查询心跳数据,解析心跳数据。——持续更新中
粘包解决方法 方法1 getXOR--是校验方法 /*** 最小数据包的长度(除开数据的N个字节)* 帧头 保留字节 协议控制字 地址字段 命令长度 命令码 命令数据 校验和* 2字节 3字节 1字节 ...
- 什么是粘包?socket 中造成粘包的原因是什么? 粘包的处理方式
1.粘包的概念 粘包:多个数据包被连续存储于连续的缓存中,在对数据包进行读取时由于无法确定发生方的发送边界,而采用某一估测值大小来进行数据读出,若双方的size不一致时就会使指发送方发送的若干包数据到 ...
- javarxtx串口接收时数据会分成好几段_【STM32】串口通信基本原理(超基础、详细版)...
STM32F1xx官方资料: <STM32中文参考手册V10>-第25章通用同步异步收发器(USART) 通信接口背景知识 设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通 ...
- 【STM32】串口通信基本原理(超基础、详细版)
STM32F1xx官方资料: <STM32中文参考手册V10>-第25章通用同步异步收发器(USART) 通信接口背景知识 设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通 ...
最新文章
- 用计算机怎么算个人所得税,个税计算器2021
- 使用MLX90640自制红外热像仪(二):API函数的使用
- CSS学习02之css导入方式
- GCC 编译时优化某一个或几个函数或者不优化某一个或几个函数
- 9月20日 DNS总结
- Android 系统(74)---Android手势触摸事件的分发和消费机制
- nofollow标签_网站Nofollow标签的应用场景
- Oracle数据库个人整理常用的表空间、用户、授权操作
- Ubuntu安装配置JDK、Tomcat、SVN服务器
- Opencv之Meanshift和Camshift
- 高斯克吕格投影换带计算(高斯正反算公式)
- android 斜线 绘制_Android绘图:绘制直线的 drawLine方法
- 使用python实现win10系统和arduino usb串口通信
- 基于 NVIDIA GPU 和 RAPIDS 加速 Spark 3.0
- 汉字转拼音pinyin
- 目标检测:SSD改进之DSSD的论文详解
- 2.3、JavaScript 数据类型 - 数字类型
- Atcoder 834 A mod B Problem 神思路取模
- 完美的扎克伯格,倒霉的Facebook
- autojs打包的软件报毒
热门文章
- 实现数组类(C++ 拷贝构造函数、拷贝函数)要判断赋值左右对象不相等,坑惨了...
- 【个人笔记】《知了堂》MySQL中的数据类型
- 美国远程医疗公司First Stop Health获210万天使投资
- flock文件锁的学习和应用
- mysql 只导数据不含表结构
- 15 sql base line 工作机制
- CentOS通过DNSpod实现动态域名
- [转载] 七龙珠第一部——第094话 太阳拳
- SecureCRT中Python脚本编写学习指南
- Python后端转JAVA最快多久_PHP多久能学会?比java,python难还是简单呢?