10月23日粘包学习以及struct模块和json模块

发布时间 2023-10-23 09:04:52作者: 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的格式是以双引号括起来的。