1.黏包现象

                      服务端:                  客户端:
第一次 dir             数据 < 1024            接收所有数据
第二次 ipconfig        数据 > 1024            接收1024个字节
第三次 dir             数据 < 1024            接收上次剩下的字节
TCP协议的流式协议,数据与水流一样源源不断 => 粘包现象
黏包现象的根本原因:缓冲区
缓冲区的作用:如果网络出现短暂的异常或者波动,接收数据就会出现出现短暂的中断,影响下载或上传的效率
什么情况下黏包现象产生黏包?
1.recv会产生黏包(如果recv接受的数据量(1024)小于发送的数据量,第一次只能接收规定的数据量1024,第二次接受剩余的数据量)
2.send也可能发生黏包现象(连续send少量的数据发到输出缓冲区,由于缓冲区的机制,可能在缓冲区中不断积压,多次写入的数据被一次性发送到网络)

2.解决黏包的方案

思路分析:
1.当第二次给服务器发送命令之前,应该循环recv直至将所用的数据全部取完
3000bytes  =>  recv3次
5000bytes  =>  recv5次
30000bytes  =>  recv30次
2.限制循环次数:当发送的总bytes个数,与接收的总bytes个数相等时,循环结束
3.如何获取发送的总bytes个数  =>  len()
4.总bytes个数的类型
将int转化成bytes,但无论总字节个数是多少,都应确保转化成固定长度的bytes,以此方便获取头部信息
通过struct将总bytes个数转化成固定的4个字节  =>  low版
总bytes个数过大时,使用struct会报错    =>   旗舰版
low版:
服务端
import socket
import subprocess
import struct
phone = socket.socket()
phone.bind(('127.0.0.1',8848))
phone.listen(5)
conn,addr = phone.accept()
while 1:try:client_data=conn.recv(1024)obj = subprocess.Popen(client_data.decode('utf-8'),shell = True,stdout = subprocess.PIPE,stderr = subprocess.PIPE)result = obj.stdout.read()+obj.stderr.read()total_size = len(result)total_size_bytes = struct.pack('i',total_size)conn.send(total_size_bytes)conn.send(result)except ConnectionResetError :break
conn.close()
phone.close()客户端
import socket
import struct
phone = socket.socket()
phone.connect(('127.0.0.1',8848))
while 1:content = input('输入:')if content.upper() == 'Q':breakphone.send(content.encode('utf-8'))head_bytes = phone.recv(4)total_size = struct.unpack('i',head_bytes)[0]total_data = b''while len(total_data)<total_size:total_data += phone.recv(1024)print(total_data.decode('gbk'))
phone.close()
旗舰版:
服务端
import socket
import subprocess
import struct
import json
phone = socket.socket()
phone.bind(('127.0.0.1', 8888))
phone.listen(5)
conn, addr = phone.accept()
while 1:try:cmd = conn.recv(1024)obj = subprocess.Popen(cmd.decode('utf-8'),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,)result = obj.stdout.read() + obj.stderr.read()result = result.decode('gbk').encode('utf-8')# 1. 制作报头head_dict = {'MD5': '7a6f150b83091ce20c89368641f9a137','file_name': '蔡徐坤篮球秀','file_size': len(result),}# 2. 将报头字典转化成json字符串head_dict_json = json.dumps(head_dict)# 3. 将json字符串 转化成byteshead_dict_json_bytes = head_dict_json.encode('utf-8')# 4. 获取报头的长度head_len = len(head_dict_json_bytes)# 5.将长度转化成固定的4个字节head_len_bytes = struct.pack('i',head_len)# 6. 发送固定的4个字节conn.send(head_len_bytes)# 7. 发送报头conn.send(head_dict_json_bytes)# 8. 发送原数据conn.send(result)except ConnectionResetError:break
conn.close()
phone.close()客户端
import socket
import struct
import json
phone = socket.socket()
phone.connect(('127.0.0.1',8888))
while 1:content = input('输入:')if content.upper() == 'Q':breakphone.send(content.encode('utf-8'))head_len_bytes = phone.recv(4)head_len = struct.unpack('i',head_len_bytes)[0]head_dict_json_bytes = phone.recv(head_len)head_dict_json = head_dict_json_bytes.decode('utf-8')head_dict = json.loads(head_dict_json)total_data = b''while len(total_data)<head_dict['file_size']:total_data += phone.recv(1024)print(total_data.decode('utf-8'))
phone.close()

转载于:https://www.cnblogs.com/wxl1025/p/11202208.html

黏包现象及其解决方法相关推荐

  1. 黏包现象和解决黏包的方法

    一, 缓冲区:  将程序和网络解耦 输入缓冲区 输出缓冲区 二,  sunbprocess模块 import subprocess sub_obj = subprocess.Popen('ipconf ...

  2. python中黏包问题的解决

    python中黏包问题的解决 1.在前面我们知道tcp容易产生黏包的问题,而udp不会产生黏包的问题,但是会产生丢包的问题,tcp应用的场景很多所以黏包问题必须要解决. 1.解决黏包问题第一种方法,我 ...

  3. socket补充:通信循环、链接循环、远程操作及黏包现象

    socket补充:通信循环.链接循环.远程操作及黏包现象 socket通信循环 server端: import socketphone = socket.socket(socket.AF_INET,s ...

  4. 粘包现象与解决粘包问题

    粘包现象与解决粘包问题 一.引入 粘包问题主要出现在用TCP协议传输中才会出现的问题,UDP不会出现,因为TCP传输中他会服务端会一次性把所有东西一并丢入缓存区,而读取的内容大小有时候没法准确的做到一 ...

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

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

  6. linux6.5系统间歇性丢包,路由器经常丢包、掉线解决方法大全

    路由器老掉线是经常出现的问题,你上网都可能遇到:丢包.上网慢.掉线.上不去网.不能浏览网页.卡.信号差.误码率高.信号延迟.连接失败.不稳定.上不去.死机.无故中断等现象,这到底是怎么回事,如何解决这 ...

  7. Win11 桌面快捷方式未全部显示的诡异现象及解决方法

    Win11 桌面快捷方式未全部显示的诡异现象及解决方法 目录 一.现象描述 二.尝试破案 三.临时方法 四.新发现 五.简单粗暴的解决方法 六.扫尾工作 独立观察员 2023 年 1 月 5 日 一. ...

  8. 黏包现象和HTTP协议

    黏包现象和HTTP协议 黏包现象 什么是黏包 解决方案 HTTP协议 HTTP协议概念 URL的概念 查看HTTP通信过程 HTTP请求报文分析 HTTP响应报文分析 静态web服务器 什么是静态we ...

  9. 【Python网络开发-黏包问题(三)黏包问题的解决办法】

    23_黏包问题的解决办法 一.目前较合理的处理方法: 为字节流加上一个报头,告诉发送的字节流总大小,让后接收端来一个死循环接收完所有数据.用struck将序列化的数据长度打包成4个字节. 使用stru ...

最新文章

  1. 计算机设备板块超跌,半导体全线拉升,沪指强势突破3600点,午后A股会再次冲高回落吗...
  2. 姿态估计开源项目汇总
  3. 程序员为这支笔掰头10个月,隔壁小学生都馋哭了
  4. react 不能往组件中传入属性的值为 undefined
  5. 利用pip3 install --upgrade批量更新已过期的python库
  6. win7远程多用户登录此计算机无法,win7如何实现远程桌面多用户登录|win7实现多用户登录远程桌面的方法...
  7. linux目录规范及简单说明
  8. mybatis源码分析执行流程
  9. 如何使用优化算法手动拟合回归模型
  10. 各个版本eclipse官方下载地址
  11. ESAPI(一)索引的操作以及数据插入
  12. 爬虫---数据的提取
  13. 可视化工具 VTK 简介
  14. js获取PC设备信息,js获取手机设备信息,最全
  15. 佛教哲学 学习笔记-07-新旧唯识-唯识学-中
  16. mysql数据模型三要素_2.3.1 逻辑数据模型概述
  17. Python非常适合副业,以私单的形式接一些小型项目
  18. 你真的懂 MP4 格式吗?
  19. 互联网日报 | 中国移动将推超级SIM卡;B站单月活跃用户突破2亿;广汽埃安品牌宣布独立运营...
  20. 牛客 最小互质数(筛法求解)

热门文章

  1. Oauth2应用场景
  2. Info2.0 让技术人员失业的技术
  3. Sample-Efficient Reinforcement Learning with Stochastic Ensemble Value Expansion
  4. Google的巨额财富之困
  5. 使用java.lang.reflect.Method.invoke抛出java.lang.IllegalArgumentException: argument type mismatch异常
  6. 百家号开发,接口发布视频需要https(记录一下)
  7. [转] 从零推导支持向量机 (SVM)
  8. 服务器系统架构图解,云服务器系统平台架构图
  9. ERROR StreamingContext: Error starting the context, marking it as stopped
  10. 阿里巴巴1688启动品牌分销云平台 这次的带头大哥是3M