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

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

时间:2023-10-23 09:12:58浏览次数:51  
标签: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的格式是以双引号括起来的。

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

相关文章

  • 每日总结(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的代......
  • laravel:路由组(10.27.0)
    一,相关文档:https://learnku.com/docs/laravel/10.x/routing/14845二,查看所有注册的路由1,查看路由:liuhongdi@lhdpc:/data/laravel/dignews$phpartisanroute:listGET|HEAD/......................................................................................
  • laravel:blade模板(10.27.0)
    一,相关文档:https://learnku.com/docs/laravel/10.x/blade/14852二,创建controller和view1,创建controllerliuhongdi@lhdpc:/data/laravel/dignews$phpartisanmake:controllerCommentController   INFO  Controller[app/Http/Controllers/CommentController.php......
  • 10.16
    学习了异常处理,异常处理的目的是依据实际情况提供不同的错误应对策略与手段,使程序更稳定,更安全。异常处理的主要用途是提供准确的错误消息,解释失败的原因、位置和错误类型等,同时提供一定的恢复能力,尽可能地保证数据完整性不被破坏,并让程序能继续运行。throws语句表明某方法中可......
  • windows python 3.10.X 安装nose运行失败解决办法
    背景win11python3.10.Xpipinstallnose以后执行nosetests报错。报错内容如下:AttributeError:module‘collections’hasnoattribute‘Callable’ 省流在python3.10.X版本下执行pipuninstallnosepipinstall nose-py3卸载以后重新安装就可以搞定。 尝......
  • 2023.10.18
    第18节:调试这一节强调了调试的重要性以及一些有关调试的心理学和技巧。1.调试的目标是解决问题,而不是对问题提出攻击性的反应。遇到bug时,应以解决问题为导向,而不是责怪他人或自己。2.当你目睹bug的发生或看到bug报告时,不要急于表示“那不可能”。首要任务是思考为什么......
  • 2023.10.19
    1.0版本生成四则运算并存入数据库importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOE......
  • 2023.10.20
    四则运算2.0失败版本server.port=8080spring.datasource.url=jdbc:h2:mem:testedspring.datasource.driverClassName=org.h2.Driverspring.datasource.username=saspring.datasource.password=passwordspring.jpa.hibernate.ddl-auto=updatepackagecom.example.mathquiz;//替换......
  • PAT 甲级【1007 Maximum Subsequence Sum】
    本题是考察动态规划与java的快速输入:max[i]表示第i个结尾的最大的连续子串和。bbegin[i]表示第[begin[i],i]为最大和的开始位置超时代码:importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;publicclassMain{@Suppres......