PYTHON3 使用socket的接收数据包最大支持1460的简单处理方式

本文介绍了一位新手在RFID读写器项目中遇到的粘包问题,通过设置标志位和按包头长度拆分数据,详细展示了如何用Python socket处理不固定长度的数据包。作者以简单易懂的方式分享了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李夕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值