1,本人小白一个,简单说下背景,这是在一个RFID读写器上进行的测试脚本开发,业务通信使用socket进行与产品的数据交互。
2,在实际通过网络助手测试中发现返回的数据量比较大,存在粘包的情况。并且接收的数据包长度不一,头部并非整段协议的长度,如下图:
3,在使用python的socket包去进行接收的情况下,发现不管设置接收的字节大小,没上报一次数据只能接收到最大1460字节。
4,这种情况作为一个专业的小白来说一般都是直接百度,然鹅,,,,百度了一圈没找到合适小白的的方式进行处理,但是呢也不想就这么放弃了,既然最大只能接收到1460字节的数据,那就从逻辑上进行自己处理了,这个方式比较适合入门级别的进行参考。
5,首先产品同一时间返回数据有小于1460的,也有大于1460的。那根据这个现象先构思了下逻辑流程图,确实返现在敲代码的时候,梳理逻辑会占用大部分时间。
6,根据这个逻辑进行接收测试,接收到的数据都是完整的数据包,因为这个是粘包的,分包后可以根据包头的长度去截取一包的数据存在列表里面在根据协议指令进行每一包数据的处理。
7,由于代码能力比较弱,这部分的上一小部分代码进行逻辑上的梳理。
在开头设置一个标志位 True
flag = True
temp = ""
这里的处理数据地方:.
接收的数据因为我们这里接收的数据是十六进制的,一个字节包含2位十六进制数据。所以数据的长度需要除以2。
#判断接收的一包数据的长度是否等于1024 if len(out_replace) / 2 = 1024: #进行临时存储 temp = temp + out_replace #将标志位改变,证明这一包数据超过1024,需要进行处理 flag = False else: """ 这里处理是因为数据小于1024,直接进行到这里,如果标志位为True, 则直接将数据给到temp进行后续处理。 """ if flag: temp = out_replace else: #判断标志位为Flase,则这一包数据小于1024,进行数据拼接后数据包完整接收 temp = temp + out_replace flag = True print("数据长度---->",len(temp)/2) print("数据内容=====>",temp)
8,完成。