首页 > 其他分享 >10月23日粘包、struct模块以及json模块

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

时间:2023-10-23 11:35:15浏览次数:37  
标签:10 struct 编码 解码 粘包 json 模块 data

目录

粘包

粘包: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 是在新房子中打开房间并摆放家具。

标签:10,struct,编码,解码,粘包,json,模块,data
From: https://www.cnblogs.com/slzjb/p/17782024.html

相关文章

  • BOSHIDA DC电源模块的数字电源优势有哪些?
    BOSHIDADC电源模块的数字电源优势有哪些?随着电子产品的日益普及,DC电源成为电子设备中不可或缺的一部分,而数字电源模块在DC电源中占据越来越重要的地位。数字电源模块相比传统的模拟电源具有很多优势,以下是其中的几点: 1.稳定性高:数字电源模块可以实现精确的电压/电流控制,具......
  • 延迟导入Python模块的几种方法
    延迟导入Python模块的几种方法-知乎(zhihu.com)#__init__.pyimportimportlib__all__=['complicated']def__getattr__(name):ifnamein__all__:returnimportlib.import_module("."+name,__name__)else:raiseAttributeError(f&qu......
  • 以下是中国最丰富的10个Java资源网站及网址:
    以下是中国最丰富的10个Java资源网站及网址:CSDN-https://www.csdn.net/Java中国-http://www.javachina.net/开源中国-https://www.oschina.net/博客园-https://www.cnblogs.com/码云-https://gitee.com/极客学院-https://www.jikexueyuan.com/ITeye-http://w......
  • 上周热点回顾(10.16-10.22)
    热点随笔:· 困境添乱:即将开庭的2场离奇诉讼 (博客园团队)· 为.NET打开新大门:OpenVINO.NET开源项目全新发布 (.NET骚操作)· 接手了一个外包开发的项目,我感觉我的头快要裂开了~ (JAVA日知录)· .NET高性能开发-位图索引(一) (InCerry)· Dotnet工具箱:开源、免费的纯前端工......
  • 【VMware篇】10-vCenter升级小技巧(一)之命令行升级
    第1章前言  为什么要升级vCenterserver?1.新功能和增强功能:升级vCenterServer可以让您拥有最新的功能和增强功能。每个vCenterServer版本都会引入新的功能和改进,这些功能可以提升管理和监控虚拟化环境的能力,增强安全性、性能和可靠性等方面。2.修复漏洞和安全问题:升级vCenter......
  • 10.23算法
    缺失数字给定一个包含[0,n] 中 n 个数的数组nums,找出[0,n]这个范围内没有出现在数组中的那个数。 示例1:输入:nums=[3,0,1]输出:2解释:n=3,因为有3个数字,所以所有的数字都在范围[0,3]内。2是丢失的数字,因为它没有出现在nums中。示例2:输入:nums=[0,1]输出:2......
  • 10-23|如何查看linux当前时间
    在Linux中,你可以使用多种方法来查看当前时间。以下是一些常见的方法:1.**`date`命令**:  `date`是最常用的方法来查看当前日期和时间。只需打开终端并输入:  ```bash  date  ```  这会显示当前的日期和时间,例如:  ```  FriSep1413:45:00U......
  • 10月23日粘包学习以及struct模块和json模块
    目录粘包如何解决粘包问题呢?struct模块json模块粘包粘包:tcp会把数据量较小,时间间隔较短的数据,当做同一个包发送粘包问题图粘包问题说白了就是客户端传给服务器的数据到服务器的时候有部分数据粘在了一块,而不是一条条的显示粘包产生情况大致图如何解决粘包问题呢?简单的方......
  • 每日总结(c/s架构简单的登录模块)
    单一职责原则实例——登录模块 登录模块在实际项目开发中很常见,请按照教材28页利用单一职责原则重构后的类图实现这一模块。1、新建 javaproject 2、导入jar包mysql-connector-java-8.0.22.jar    *此处注意jar包的版本不能过低,否则数据库连接失败3、......
  • laravel:编写命令行脚本(10.27.0)
     一,相关文档https://learnku.com/docs/laravel/10.x/artisan/14859二,php代码1,创建commandliuhongdi@lhdpc:/data/laravel/dignews$phpartisanmake:commandCart   INFO  Consolecommand[app/Console/Commands/Cart.php]createdsuccessfully.2,command的代......