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

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是一个简单的示例,演示了如何解析通过 Socket 接收到的数据包: ```python import socket # 创建一个Socket对象 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接到服务器 server_address = ('localhost', 8000) sock.connect(server_address) # 接收数据包 data = b'' while True: packet = sock.recv(1024) if not packet: break data += packet # 解析数据包 # 假设数据包的格式为:4字节的包头长度 + 包头数据 + 包体数据 header_length = int.from_bytes(data[:4], byteorder='big') header_data = data[4:4+header_length] body_data = data[4+header_length:] # 对包头和包体进行进一步的解析、处理等操作 # 关闭Socket连接 sock.close() ``` 在这个例子中,我们首先创建了一个 Socket 对象,然后连接到服务器。然后,我们通过循环接收数据包,每次接收到的数据包都会被累加到一个 `data` 变量中。当接收到的数据为空时,循环结束。 接下来,我们假设数据包的格式为:4字节的包头长度 + 包头数据 + 包体数据。我们使用 `int.from_bytes()` 函数将前4个字节解析为包头长度,然后使用切片操作将包头数据和包体数据分离出来。最后,我们可以对包头和包体进行进一步的解析、处理等操作。 最后,我们关闭了 Socket 连接。需要注意的是,这个例子仅仅是一个简单的示例,实际上数据包的格式可能会更加复杂,需要根据实际情况进行相应的解析处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李夕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值