10月23日粘包、struct模块以及json模块

发布时间 2023-10-23 11:31:59作者: songjunwan

粘包

粘包:tcp会把数据量较小,时间间隔较短的数据,当做同一个包发送

粘包问题图

粘包问题说白了就是客户端传给服务器的数据到服务器的时候有部分数据粘在了一块,而不是一条条的显示

粘包产生情况大致图

如何解决粘包问题呢?

简单的方式就是加大socket里面的recv()让其能收取更多的数据,就相当于一次性把所有数据收取过来。

视频里的方法太水了,作用都不大。

对于粘包问题最常见且相对简便的方法是定长消息或消息边界标记

定长消息:就是给每条消息的长度固定一个特定的字节数,就是给消息长度加点限制

消息边界标记:简白点就是使用换行符\n或回车符等

struct模块

这个模块的作用是把一个类型,如数字,转成固定长度的bytes

这个模块有主要用法有两个一个pack和unpack

pack(format, v1, v2, ...) 函数的作用是将指定格式的数据打包(编码)成一个字节字符串(bytes),这个方法里面的format是格式化字符串也就是选择转换的类型:

  • i 表示有符号整数,通常用于处理整数数据。
  • I 表示无符号整数,用于处理没有正负号的整数。
  • f 表示单精度浮点数,用于处理小数。
  • d 表示双精度浮点数,用于处理更精确的小数。
  • c 表示字符,用于处理单个字符。
  • s 表示字符串,用于处理文本数据。

至于里面的v1,v2什么的是要被打包的数据

unpack(format, buffer) 函数的作用是从二进制数据中解包(解码)出 Python 数据。第一个format也是格式化字符串,需要解码的数据是用什么格式化字符串编的码就用什么来解码

#struct模块的作用把一个类型,如数字,转成固定长度的bytes
import struct
obj = struct.pack('i', 1500000000)
print(obj)
print(len(obj))

l = struct.unpack('i', obj)#因为用i编的码就要用i来解码
print(l)
print(l[0])#这里用索引来取值

结果如图

json模块

主要功能就是编码json.dumps(需要编码的对象),解码json.loads(需要编码的对象)

编码实例:

import json

data = {
    'name': 'John',
    'age': 30,
    'is_student': False,
    'courses': ['Math', 'History', 'Science']
}



#这里把data编码好后赋值给json_data这个变量
json_data = json.dumps(data)  # 编码为JSON字符串

#将编码完的数据进行输出
print(json_data)

结果如图:

编码前是单引号,编码就变成了双引号,这就是json的标准格式以双引号括起来的,而且具有一定的格式。

将入解码的实例:

import json

data = {
    'name': 'John',
    'age': 30,
    'is_student': False,
    'courses': ['Math', 'History', 'Science']
}



#这里把data编码好后赋值给json_data这个变量
json_data = json.dumps(data)  # 编码为JSON字符串

#将编码完的数据进行输出
print(json_data)

#解码
data = json.loads(json_data)#这里把json.loads给解码成python对象

#这里将解码后的数据给输出出来
print(data)

结果如图

从结果可以看出json的格式是以双引号括起来的。

此模块还有两个方法dump和load,它们两个一般和with一起使用

具体格式如下

import json

data = {'name': 'John', 'age': 30, 'city': 'New York'}

with open('json.py', 'w') as file:#json.py
    json.dump(data, file)

# 从文件中读取 JSON 字符串
import json

with open('json.py', 'r') as file:
    data = json.load(file)

print(data)

dump(obj, fp, ...)里面的obj是要被变成json的python的数据结构,fp是文件对象上面的fp就是file

可以这么说就是这个方法把python的数据序列化成json格式后再保存到另一个文件里面

load(fp) 里面的fp是文件对象,这个方法会把指定对象里面的json数据读取出来然后解码成python的数据结构然后我这里把它解码的结果赋值给了data这个变量

但是我的python版本无法使用这个两个方法了解即可。

具体情况如图

这里将它们的关系来整理一下

在 Python 中,dumps 将你的家具打包成一个箱子(JSON字符串),而 loads 则是在新房子中解开箱子,并将家具放在正确的位置。

此外,dump 类似于把家具打包后存放在一个房间(JSON文件)中,而 load 是在新房子中打开房间并摆放家具。