python 心电处理包_python 黏包现象及其解决方案

一、数据缓冲区

缓冲区(buffer),它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,显然缓冲区是具有一定大小的。

二、为什么要缓冲区 (详情参考:https://www.cnblogs.com/mlgjb/p/7991903.html)

1.可以解除高速设备与低速设备的不匹配,高速设备需要等待低速设备的制约关系,数据可以直接送往缓冲区,高速设备不用再等待低速设备,提高了计算机的效率。

2.可以减少数据的读写次数,如果每次数据只传输一点数据,就需要传送很多次,这样会浪费很多时间,因为开始读写与终止读写所需要的时间很长,如果将数据送往缓冲区,待缓冲区满后再进行传送会大大减少读写次数,这样就可以节省很多时间。

三、粘包现象

1、小数据传输粘包

源代码:

importsocket

server=socket.socket()

server.bind(('127.0.0.1',8001))

server.listen()

conn,addr=server.accept()

msg_1=conn.recv(1024).decode("utf-8")

msg_2=conn.recv(1024).decode("utf-8")print("客户端>>>",msg_1)print("客户端>>>",msg_2)

conn.close()

server.close()

黏包现象服务端

importsocketimporttime

client=socket.socket()

client.connect(('127.0.0.1', 8001))

client.send(b'123')#time.sleep(0.1) 加入时间缓冲,让每次传入和接受的数据有序

client.send(b'456')

client.close()

黏包现象客户端

黏包现象粗略的解释:数据在传输过程中,未来得及按照先后次序传输和接受,数据都进入了数据缓冲区中,再接受的数据时候,不知道按照怎么的数据长度接受,就按照给定的1024的长度接收,因此出现了黏包.

解决方案:

方案一、传输过程中每次都告诉对方应该如何接收数据。

方案二、把传输和接受的间隔加大,保证每次都能顺利的满足一个接着一个传输。(time.sleep(0.1))

2、大数据传输粘包(模拟cmd指令)

源代码:

importsubprocessimportsocketimporttime

server=socket.socket()#创建socket对象

server.bind(('127.0.0.1',8001))#绑定ip_port

server.listen()#监听

conn,addr=server.accept()#等待连接,获取连接通道和地址

while 1:

time.sleep(0.1)#减少内存占用

cmd_msg=conn.recv(1024).decode("utf-8")#判断是否结束doc指令读取

if cmd_msg=="exit" or cmd_msg=="exit()":break

else:#创建读取cmd指令对象

obj_sub=subprocess.Popen(

cmd_msg,

shell=True,

stdout=subprocess.PIPE,

stderr=subprocess.PIPE

)

out_info=obj_sub.stdout.read()

err_info=obj_sub.stderr.read()iferr_info:#不存在该命令则输出错误信息,并打印字节数

conn.send(err_info)print(len(err_info))else:#存在输入的命令则发送指令执行的结果,并打印字节数

conn.send(out_info)print(len(out_info))

conn.close()

server.close()

大数据黏包现象服务器

importsocket

client=socket.socket()#创建客户端对象

client.connect(('127.0.0.1', 8001))#连接服务器的ip_port

while 1:

cmd=input("cmd>>>")

client.send(cmd.encode("utf-8"))#判断是否为退出指令

if cmd=="exit" or cmd=="exit()":break

else:#接受客服端返回信息

out=client.recv(1024).decode("gbk")print(out)

client.close()

大数据黏包现象客户端

结果显示:

1 C:\Python36\python.exe "F:/qishi/day 28 黏包 合法性链接/黏包现象/黏包现象2客户端.py"

2 cmd>>>ipconfig -all3

4 Windows IP 配置5

6 主机名 . . . . . . . . . . . . . : DESKTOP-MT7JLPA7 主 DNS 后缀 . . . . . . . . . . . :8 节点类型 . . . . . . . . . . . . : 混合9 IP 路由已启用 . . . . . . . . . . : 否10 WINS 代理已启用 . . . . . . . . . : 否11

12 无线局域网适配器 WLAN:13

14 媒体状态 . . . . . . . . . . . . : 媒体已断开连接15 连接特定的 DNS 后缀 . . . . . . . :16 描述. . . . . . . . . . . . . . . : Qualcomm Atheros AR9485WB-EG Wireless Network Adapter17 物理地址. . . . . . . . . . . . . : BC-30-7D-96-2D-2B18 DHCP 已启用 . . . . . . . . . . . : 是19 自动配置已启用. . . . . . . . . . : 是20

21 无线局域网适配器 本地连接* 1:22

23 媒体状态 . . . . . . . . . . . . : 媒体已断开连接24 连接特定的 DNS 后缀 . . . . . . . :25 描述. . . . . . . . . . . . . . . : Microsoft Wi-Fi Direct Virtual Adapter26 物理地址. . . . . . . . . . . . . : 1E-30-7D-96-2D-2B27 DHCP 已启用 . . . . . . . . . . . : 是28 自动配置已启用. . . . . . . . . . : 是29

30 以太网适配器 以太网:31

32 连接特定的 DNS 后缀 . . . . .33 cmd>>>dir34 . . :35 描述. . . . . . . . . . . . . . . : Realtek PCIe GBE Family Controller36 物理地址. . . . . . . . . . . . . : C4-54-44-F5-84-6A37 DHCP 已启用 . . . . . . . . . . . : 是38 自动配置已启用. . . . . . . . . . : 是39 本地链接 IPv6 地址. . . . . . . . : fe80::64a8:6af:a71b:edad%5(首选)40 IPv4 地址 . . . . . . . . . . . . : 192.168.12.51(首选)41 子网掩码 . . . . . . . . . . . . : 255.255.255.0

42 获得租约的时间 . . . . . . . . . : 2018年11月26日 15:01:29

43 租约过期的时间 . . . . . . . . . : 2018年11月27日 15:01:28

44 默认网关. . . . . . . . . . . . . : 192.168.12.254

45 DHCP 服务器 . . . . . . . . . . . : 192.168.12.254

46 DHCPv6 IAID . . . . . . . . . . . : 63198276

47 DHCPv6 客户端 DUID . . . . . . . : 00-01-00-01-23-7C-84-72-C4-54-44-F5-84-6A48 DNS 服务器 . . . . . . . . . . . : 114.114.114.114

49 TCPIP 上的 NetBIOS . . . . . . . : 已启用50

51 cmd>>>

客户端显示结果

C:\Python36\python.exe "F:/qishi/day 28 黏包 合法性链接/黏包现象/黏包现象2服务器.py"ipconfig-all 命令执行结果长度 1912dir 命令执行结果长度505

服务端显示结果

现象简述:首先执行了一次ipconfig -all,他的结果数据长度是1912,而我们接受的数据长度是1024,之后又执行了一次dir,dir结果长度是505,我们再一次接受的数据,依旧是ipconfig -all 结果数据.出现了黏包现象.

黏包现象成因:执行的数据进入缓冲区,并且数据的大小大于接受数据的大小,因此我们一次接受只能接受1024个字节,之后又执行一个命令后,命令的结果又会进入数据缓冲区,所有我们接受的数据显示的是上一个命令残余的数据.我们每次接受的数据都是1024,还有可能出现多命令的数据同时出现的风险.

解决方案:

方案一、按照发送数据的长度接受数据,由于缓冲区数据容量有限,我们采用循环接受数据的方法接受大数据。

方案二、把数据的长度信息与数据信息合并一次性发给接受端,接收端先提出数据长度,再按照数据长度接受数据。

方案一源代码:

1 importsubprocess2 importsocket3 importtime4 server=socket.socket()#创建socket对象

5

6 server.bind(('127.0.0.1',8001))#绑定ip_port

7 server.listen()#监听

8 conn,addr=server.accept()#等待连接,获取连接通道和地址

9

10 while 1:11 time.sleep(0.1)#减少内存占用

12 cmd_msg=conn.recv(1024).decode("utf-8")13 #判断是否结束doc指令读取

14 if cmd_msg=="exit" or cmd_msg=="exit()":15 break

16 else:17 #创建读取cmd指令对象

18 obj_sub=subprocess.Popen(19 cmd_msg,20 shell=True,21 stdout=subprocess.PIPE,#标准化输出

22 stderr=subprocess.PIPE #标准化错误输出

23 )24 out_info=obj_sub.stdout.read()25

26 err_info=obj_sub.stderr.read()27

28

29 iferr_info:30 #不存在该命令则输出错误信息,并打印字节数

31 data_len =len(err_info)32 all_send_datalen=033 print(f"{cmd_msg} 命令执行结果长度", data_len)34 #把数据长度发送给接收端

35 conn.send(str(data_len).encode("utf-8"))36 while all_send_datalen

37 #递增式改变截取位置

38 every_send_data=err_info[all_send_datalen:all_send_datalen+1024]39 conn.send(err_info)40 all_send_datalen+=len(every_send_data)41

42 else:43 #存在输入的命令则发送指令执行的结果,并打印字节数

44 data_len =len(out_info)45

46 all_send_datalen =047 print(f"{cmd_msg} 命令执行结果长度:", data_len)48

49 #把数据长度发送给接收端

50 conn.send(str(data_len).encode("utf-8"))51 while all_send_datalen < data_len: #当发送的数据小于数据总长就不断的放送

52 #递增式改变截取位置

53 #每1024个字节发一次

54 every_send_data = out_info[all_send_datalen:all_send_datalen + 1024]55 conn.send(every_send_data)56

57 all_send_datalen +=len(every_send_data)58

59 conn.close()60 server.close()

大数据黏包服务器

1 importsocket2 client=socket.socket()#创建客户端对象

3 client.connect(('127.0.0.1', 8001))#连接服务器的ip_port

4

5 while 1:6

7 cmd=input("cmd>>>")8 client.send(cmd.encode("utf-8"))9 #判断是否为退出指令

10 if cmd=="exit" or cmd=="exit()":11 break

12 else:13 #客客户端接受返回信息

14 data_len=client.recv(1024).decode("utf-8")15 int_data_len=int(data_len)16 print(int_data_len)17 #接受的字节个数,计数比较

18 all_recv_datalen=019 #用于接收到的字节拼接

20 all_data=b''

21 #循环接受数据

22 while all_recv_datalen<23>

24 every_recv_data=client.recv(1024)25 all_recv_datalen+=len(every_recv_data)26 all_data +=every_recv_data27 #输出打印

28 print(all_data.decode("gbk"))29

30 client.close()

大数据黏包客户端

方案二struct打包:

struct操作简介

importstruct#打包pack#struct.pack(格式,数据)#a=231546789#b=struct.pack("i",a)#print(b)#b'\xa5\x1f\xcd\r'

#解包unpack,结果是元祖#struct.unpack(格式,数据)

c=struct.unpack("i",b'\xa5\x1f\xcd\r')print(c) #(231546789,)

a=c[0]print(a)#231546789

源码:

importsocketimportsubprocessimportstruct

server=socket.socket()

ip_port= ('127.0.0.1',8001)

data_full_len= 0 #统计发送数据的长度

server.bind(ip_port)

server.listen()

conn,addr=server.accept()while 1:

from_client_cmd= conn.recv(1024).decode('utf-8')

sub_obj=subprocess.Popen(

from_client_cmd,

shell=True,

stdout=subprocess.PIPE,

stderr=subprocess.PIPE,

)#subprocess对象.read 得到的结果是bytes类型的

cmd_res =sub_obj.stdout.read()

data_len= len(cmd_res) #总数据长度

data_len_str =str(data_len)print('结果长度>>>',data_len)#将真实数据长度打包成4个字节的数据

struct_data_len = struct.pack('i',data_len)

conn.send(struct_data_len+ cmd_res)

大数据黏包struct服务器

importjsonimportsocketimportstruct

client=socket.socket()

ip_port= ('127.0.0.1',8001)

client.connect(ip_port)

all_recv_len=0

all_data_byte= b''

while 1:

client_cmd= input('请输入系统指令>>>')

client.send(client_cmd.encode('utf-8'))#先接收4个字节,这4个字节是真实数据长度加工成的

recv_data_len = client.recv(4)#将4个字节长度的数据,解包成后面真实数据的长度

real_data_len = struct.unpack('i',recv_data_len)[0]print(real_data_len)

server_result=client.recv(real_data_len)print(server_result.decode('gbk'))

大数据黏包struct客户端

加强版:

1 importstruct2 importsocket3 importsubprocess4 importtime5

6 server=socket.socket()7 server.bind(("127.0.0.1",8001))8 server.listen()9 conn,addr=server.accept()10 while 1:11 time.sleep(0.1)12 cmd_msg=conn.recv(1024).decode("utf-8")13 obj_sub=subprocess.Popen(14 cmd_msg,15 shell=True,16 stdout=subprocess.PIPE,17 stderr=subprocess.PIPE18 )19 cmd_out=obj_sub.stdout.read()20 cmd_erro=obj_sub.stderr.read()21 ifobj_sub.stdout:22 out_len=len(cmd_out)23 print(cmd_msg+"\t"+str(out_len))24 b_out_len=struct.pack("i",out_len)25 conn.send(b_out_len+cmd_out)26

27 else:28 err_len =len(cmd_erro)29 int(cmd_msg + "\t" +str(err_len))30 b_err_len = struct.pack("i", err_len)31 conn.send(b_err_len+cmd_erro)32 conn.close()33 server.close()

完整版服务器

1 importstruct2 importsocket3 importsubprocess4 importtime5

6 client=socket.socket()7 client.connect(("127.0.0.1", 8001))8 while 1:9 time.sleep(0.1)10 cmd=input("cmd>>>").encode("utf-8")11 client.send(cmd)12 #接受数据

13 data_len_pack=client.recv(4)14 data_len=struct.unpack("i",data_len_pack)[0]15 print(data_len)16 data=client.recv(data_len).decode("gbk")17 print(data)18 client.close()

完整版客服端

23>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

消息订阅与发布(pubsub)

一、一种组件间通信的方式&#xff0c;适用于任意组件间通信。 二、使用步骤&#xff1a; 安装 pubsub&#xff1a;npm i pubsub-js引入&#xff1a;import pubsub from pubsub-js接收数据&#xff1a;A组件想接收数据&#xff0c;则在A组件中订阅消息&#xff0c;订阅的回调在…

JVM经典五十问

文章目录1.什么是JVM?内存管理2.能说一下JVM的内存区域吗&#xff1f;3.说一下JDK1.6、1.7、1.8内存区域的变化&#xff1f;4.为什么使用元空间替代永久代作为方法区的实现&#xff1f;5.对象创建的过程了解吗&#xff1f;6.什么是指针碰撞&#xff1f;什么是空闲列表&#xf…

增量更新同步_OneDrive增量更新功能正式推出 仅同步文件更改部分降低网络占用...

微软的云存储应用OneDrive目前用户量还是蛮多的&#xff0c;不过在功能更新方面OneDrive动作相对来说还是有些慢的。比如非常实用的增量更新功能直到最近微软才正式推出&#xff0c;现在所有个人和企业级用户都可以使用增量更新功能喽。增量更新功能还是有网友在 2014 年向微软…

Vue.$nextTick

一、语法&#xff1a;this.$nextTick(回调) 二、在下一次 DOM 更新结束后执行其指定的回调函数 三、啥时候调用&#xff1a;当改变数据后&#xff0c;要基于更新后的新 DOM 进行某些操作时&#xff0c;要在 nextTick 所指定的回调函数中执行

div靠边隐藏_css如何隐藏div不占位置?

display 属性依照词义真正隐藏元素。将 display 属性设为 none 确保元素不可见并且连盒模型也不生成。使用这个属性&#xff0c;被隐藏的元素不占据任何空间。一旦 display 设为 none 任何对该元素直接打用户交互操作都不可能生效。此外&#xff0c;读屏软件也不会读到元素的内…

MySQL:错误代码1215 无法添加外键约束的解决思路

环境说明: ※MySQL ver:5.7 当你需要添加外键约束的时候,却发现mysql报了个1215错误,一脸懵逼的找到这个博客,那你的问题可能就会得到解决. 解决思路 1.检查两个字段的数据类型是否一致 2.检查两个字段的数据长度是否一致(有时候不指定int长度,长度是10,有时候是11&#xff0…

Vue 封装的过渡与动画

一、作用&#xff1a;在插入、更新或移除DOM元素时&#xff0c;在合适的时候给元素添加样式类名 二、图示 三、写法&#xff1a; 元素进入的样式 v-enter | v-enter-active | v-enter-to元素离开的样式 v-leave | v-leave-active | v-leave-to使用 transition 包裹要过渡的元…

各纬度气候分布图_地理:世界各种气候类型分布图(高清版)汇总!以及解答分析哦~...

各种气候类型分布图送给大家&#xff0c;点开看放大更清晰哟&#xff01;世界气候类型分布图▼热带气候类型分布图▼热带雨林气候分布图▼热带草原气候分布图▼热带季风气候分布图▼热带沙漠气候分布图▼温带气候分布图▼地中海气候分布图▼亚热带季风和季风性湿润气候分布图▼…

使用navicat for mysql 创建外键foreign keys时,总会自动创建索引indexs

使用navicat for mysql 创建外键foreign keys时&#xff0c;总会自动创建索引indexs。如果删除这个索引就会提示错误error 1553:cann’t drop index…:needed in a foreign key constraint。请教各位&#xff0c;该如何解决呢&#xff0c;不想要indexs 这个好像必须要吧 主键默…

Vue 脚手架配置代理

一、在 vue.config.js 中添加配置 devServer: {proxy: http://localhost:5000 }优点&#xff1a;配置简单&#xff0c;请求资源时直接发送给前端&#xff08;8080&#xff09;即可缺点&#xff1a;不能配置多个代理&#xff0c;不能灵活的控制请求是否走代理工作方式&#xff…

固定 顶部_优质的阳光板温室的顶部应该如此安装,专业的人做专业的事

阳光板温室多为文洛型&#xff0c;多采用一跨多顶&#xff0c;外形现代&#xff0c;结构稳定&#xff0c;形式美观大方&#xff0c;视觉流畅&#xff0c;保温性能卓越&#xff0c;透光率适中&#xff0c;多雨槽&#xff0c;大跨度&#xff0c;排水量大&#xff0c;抗风能力强&a…

json对象、json字符串的区别和相互转换

开发时&#xff0c;json字符串和json对象傻傻分不清楚&#xff0c;ajax异步请求后&#xff0c;会根据返回的data值判断请求是否成功&#xff0c;访问data.msg会提示‘undefined’&#xff0c;将data转换为json对象即可。 一、json对象、json字符串的区别 1、json对象 json对…

python判断两个列表内容是否一致_检查两个列表在Python中是否相同

在python数据分析中&#xff0c;当我们需要比较两个列表并找出它们是否具有相同元素或没有相同含义时&#xff0c;我们可能会遇到这种情况。例题listA [Mon,Tue,Wed,Thu]listB [Mon,Wed,Tue,Thu]# Given listsprint("Given listA: ",listA)print("Given listB…

Json对象和Json字符串的区别

JSON对象 有时候在做项目的时候时常将这两个概念弄混淆&#xff0c;尤其是在使用springmvc的时候&#xff0c;后台RequestBody接受的是一个json格式的字符串&#xff0c;一定是一个字符串。 先介绍一下json对象&#xff0c;首先说到对象的概念&#xff0c;对象的属性是可以用&…

vuex 状态管理

一、在组件中读取 vuex 中的数据 $store.state.sum;二、组件中修改 vuex 中的数据 $store.dispatch(actions fn name, 数据) $store.commit(mutations fn name, 数据)如果没有网络请求或者其他业务逻辑&#xff0c;组件中也可以越过 actions&#xff08;不写 dispatch 直接写…

flask mysql 1366_2017-11-17 Python Flask Script+mysql环境设置

【1.初级版】flask-scrpit安装。使用flask-scrpit可以创建命令&#xff0c;并在Flask的应用上下文中执行&#xff0c;因为这样才能对Flask对象进行修改。Flask Script自带了一些默认的命令&#xff0c;可以运行服务器或者开启带应用上下文的Python命令行。env) D:\python\flask…

vuex 的模块化+命名空间

一、目的&#xff1a;让代码更好维护&#xff0c;让多种数据分类更加明确 二、修改 store.js const person {namespaced: true; // 开启命名空间state: {},getters: {},actions: {},mutations: {} }const count {namespaced: true; // 开启命名空间state: {},getters: {},ac…

idea中常用的快捷键以及一些奇淫技巧 , 加快我们的开发效率

idea中常用的快捷键以及一些奇淫技巧 &#xff0c; 加快我们的开发效率 &#xff01;&#xff01;&#xff01; 知道类名查找你本地以的类 &#xff08;你pom中依赖的类你自己创建的类&#xff09;------------- ctrlshiftt 修改你创建的变量 以及你后面都引用的变量 &#x…

apache2 php mysql_二、Linux服务器apache2+PHP7+mysql环境配置

关于网站搭建的基础知识&#xff0c;请见我的另一篇文章https://www.jianshu.com/p/9c65fcb14e4f此处不加赘述。本文仅介绍Linux服务器环境的配置。一、安装包下载与安装1.安装apache2sudo apt-get install apache22.安装PHP//-y的意思是全部默认选择yes//8条命令分8次输入//1s…

前端给后端传递数据的时候,有些后端自己可以获取到的值应该由前端传递吗?

前端给后端传递数据的时候,有些后端自己可以获取到的值应该由前端传递吗? 场景: 1.比如我向后端传递一个学生做的试卷. 2.后端需要我把学生的答案和标准答案(在获取试卷的时候给我的,我知道很扯淡)同时传递给他. 我认为标准答案没必要传给他 ,因为他可以根据我传给他的试卷…