关于SOCKET粘包的一些问题,我大概描述了一下,一些细节帮看下怎么处理

时间:2022-01-18 19:35:07

你就从收到byte[],如何做缓存,如何判断根据包头判断这个包是新包还是余下的包尾包 

比如byte[] rec为收到的包
包可以转成utf8格式为字符串 
从rec中先取一个INT packtypeid 指令出来,再取一个INT len包长出来 

那我得判断2个变量typeid,len取到的数据是否正常,是否是包尾吧 
一般typeid5位数,len一般是大于0而且上于30M以内吧 
  
小于30M以内 
 如果不在这个范围的可能就不是新包了有可能是包尾了 
 但是如果这个包尾后面还粘了另一个包的包头呢,这该怎么样拆开呢 
 拆开然后和上一个包头的组装在一起就得一个完整的包了 
 可以下发事件了 
 帮我写这部分 就得了帮我看下怎么处理这些细节问题 

4 个解决方案

#1


关于SOCKET粘包的一些问题,我大概描述了一下,一些细节帮看下怎么处理
严格发送,宽松接收

如果非要从byte[]中截获消息,然后进行分析。
严格发送:比如说一个数据包可以规定每次发送多少,前多少位是header
header 包括标识,数据长度,后面还有多少个包全都是数据,数据尾标识,校验和,header固定为128位或者多少,即使数据1位也要发送129位。

接收宽松:比如说接收到一个数据包,发现校验和不对,会要求重发,数据错误不会让接收端挂掉等等。

具体的实现还需要结合你的需求。我也说的比较乱。凑合看看吧

#2


有没有能详细的写出部分代码的谢谢了

#3


引用 2 楼 csdsuper 的回复:
有没有能详细的写出部分代码的谢谢了


…… 关于SOCKET粘包的一些问题,我大概描述了一下,一些细节帮看下怎么处理爱莫能助了,因为这可能会涉及到业务逻辑,不清楚业务逻辑,旁人设计不好的。

#4


我的程序描述都这清楚了逻辑都描述出来了

#1


关于SOCKET粘包的一些问题,我大概描述了一下,一些细节帮看下怎么处理
严格发送,宽松接收

如果非要从byte[]中截获消息,然后进行分析。
严格发送:比如说一个数据包可以规定每次发送多少,前多少位是header
header 包括标识,数据长度,后面还有多少个包全都是数据,数据尾标识,校验和,header固定为128位或者多少,即使数据1位也要发送129位。

接收宽松:比如说接收到一个数据包,发现校验和不对,会要求重发,数据错误不会让接收端挂掉等等。

具体的实现还需要结合你的需求。我也说的比较乱。凑合看看吧

#2


有没有能详细的写出部分代码的谢谢了

#3


引用 2 楼 csdsuper 的回复:
有没有能详细的写出部分代码的谢谢了


…… 关于SOCKET粘包的一些问题,我大概描述了一下,一些细节帮看下怎么处理爱莫能助了,因为这可能会涉及到业务逻辑,不清楚业务逻辑,旁人设计不好的。

#4


我的程序描述都这清楚了逻辑都描述出来了