23_黏包问题的解决办法

一、目前较合理的处理方法:

为字节流加上一个报头,告诉发送的字节流总大小,让后接收端来一个死循环接收完所有数据。用struck将序列化的数据长度打包成4个字节。

使用struct模块可以用于将Python的值根据格式符,转换为C语言的结构(byte类型),便于数据流传输。

二、案例

1、代码

  • 服务器端

  • 客户端

2、运行结果

  • 服务器端

  • 客户端

三、源代码

1、服务器端

# -*- coding:utf-8 -*-import socket
from socket import *
import structserver = socket(AF_INET,SOCK_STREAM)
server.bind(('',7088))
server.listen(5)conn,addr = server.accept()f = open(r'D:\服务器.mp4','wb')header_data = conn.recv(4)
print(struct.unpack("!i",header_data))
size = struct.unpack("!i",header_data)[0] #unpack返回的都是一个元组,元组的第一个值就是长度recv_size = 0 #已经接收到多长的数据
while recv_size < size:#等于size时就已补满足条件data = conn.recv(1024)recv_size += len(data) #接收的字节长度要累加f.write(data)print("服务器端接收完成")
f.close()
conn.close()
server.close()

2、客户端

# -*- coding:utf-8 -*-from socket import *
import struct
import os
client = socket(AF_INET,SOCK_STREAM)
client.connect(('192.168.1.13',7088))#客服端传送一个文件到服务器,new.mp4
file_path = 'new.mp4'
f = open(file_path,'rb')#在发型真正的文件数据之前,先准备一个报头
size = os.path.getsize(file_path) #文件的字节长度
#创建一个报头,i为4个字节的int,这个大小并不是输入的大小,而是文件的大小。
header = struct.pack('!i',size) # 接收方会使用struct解包,得到一个int类型数字
client.send(header)#发送文件内容
while True:data = f.read(1024) #每次读取1024字节if not data:#如果字节是空的(文件已读完)breakclient.send(data) #发送给服务器的文件内容print("客户端上传文件完成")
f.close()
client.close()

【Python网络开发-黏包问题(三)黏包问题的解决办法】相关推荐

  1. windows phone 网络开发三部曲(一)各种包的各种抓法

    首先感谢大家对我上一篇博客的支持,让我也体验了一把上榜的感觉. 这无疑是对我这个刚刚打算,认真写写博客的人的莫大的鼓励,再次感谢(鞠躬)!! 接下来想和大家分享一些关于windows phone网络开 ...

  2. 5 个 Android 开发中比较常见的内存泄漏问题及解决办法

    Android开发中,内存泄漏是比较常见的问题,有过一些Android编程经历的童鞋应该都遇到过,但为什么会出现内存泄漏呢?内存泄漏又有什么影响呢? 在Android程序开发中,当一个对象已经不需要再 ...

  3. Python在指定环境下安装第三方库的报错解决办法

    Python在指定环境下安装第三方库的报错解决办法 在python安装第三方库时,如果直接打开cmd命令提示符,并输入下列安装命令,则会默认安装在base环境下 但base环境下的包新建的虚拟环境是无 ...

  4. Xamarin开发安装Visual Studio 2015 update2报错的解决办法

    Xamarin开发安装Visual Studio 2015 update2报错的解决办法 错误信息:update 2 requires a member of the visual studio 20 ...

  5. windows环境下Eclipse开发MapReduce程序遇到的四个问题及解决办法

    按此文章<Hadoop集群(第7期)_Eclipse开发环境设置>进行MapReduce开发环境搭建的过程中遇到一些问题,饶了一些弯路,解决办法记录在此: 文档目的: 记录windows环 ...

  6. 前端面试查漏补缺--(三) 跨域及常见解决办法

    前言 本系列最开始是为了自己面试准备的.后来发现整理越来越多,差不多有十二万字符,最后决定还是分享出来给大家. 为了分享整理出来,花费了自己大量的时间,起码是只自己用的三倍时间.如果喜欢的话,欢迎收藏 ...

  7. ANDROID开发java.lang.NoClassDefFoundError: com.baidu.location.LocationClient的解决办法

     ANDROID开发java.lang.NoClassDefFoundError: com.baidu.location.LocationClient的解决办法 java.lang.NoClassDe ...

  8. Python使用opencv打开笔记本摄像头时遇到的问题及解决办法

    Python使用opencv打开笔记本摄像头时遇到的问题及解决办法 最近在学习python,想用opencv做个人脸检测,打开笔记本摄像头时遇到了问题.摄像头总是闪一下就关闭,并提示一行警告([ WA ...

  9. GTASA圣安地列斯大量高清贴图包导致游戏崩溃闪退的解决办法

    GTASA圣安地列斯大量高清贴图包导致游戏崩溃闪退的解决办法 记录博文 情况说明 在安装了很多不同的 HD 纹理包之后(例如美化包)&驾驶或飞行了大约10分钟,游戏导致崩溃.不管用啥 stre ...

  10. 【亲测】Parallels Desktop 16 / 17在MacOs Big Sur / Monterey下网络初始化失败:您的虚拟机将继续正常运作 解决办法

    场景: Mac升级Big Sur / Monterey后,然后再升级Parallels Desktop到16/17版本后,Parallels Desktop开启windows或者其他虚拟机就出现 网络 ...

最新文章

  1. 计算机导论简答芯片,吉大计算机 - 计算机导论简答题 (2011级)
  2. android应用兼容报告,手机资讯导报:华为发布国内首份Android7.0应用兼容报告
  3. 根据文法画出语法树_编译工程5:语法分析(3)
  4. leetcode340. 至多包含 K 个不同字符的最长子串
  5. 浏览器解析JavaScript的原理
  6. yii2.0框架debug模式
  7. 程序员在服务器安“炸弹”格式化原公司内部资料!
  8. 64. 雇员管理系统
  9. sqluldr2用法
  10. ​「5G消息」的最新消息
  11. 常见的几种加密方法和实现
  12. [JS]JSON字符串与JS对象的转换
  13. c语言cast的用法,static_cast 用法
  14. 濉溪海潮计算机学校校长是谁,濉溪县城关中心学校举办退休教师欢送会
  15. 读淘宝页面字节流提取宝贝图片地址宝贝标题宝贝价格
  16. 视频教程-怎么架构生产数据库--生产数据库优化的一种方式-MySQL
  17. H5网页跳转至微信小程序
  18. 关于个人的第二个程序——黑白棋续
  19. python二级考试细节整理
  20. 同学,同事,KTV聚会的小游戏

热门文章

  1. 开源JAVA版CMDB,CMDB到底如何建设?
  2. [免费专栏] Android安全之利用JDB调试Android应用程序(动态代码注入技术)
  3. mosh 基于UDP方式ssh连接 不怕掉线
  4. 连接手表_一图看懂小米手表/Color连接iPhone/安卓手机的功能差别
  5. 三张图搞透第一范式(1NF)、第二范式(2NF)和第三范式(3NF)的区别
  6. 如何用手机HTML制作哆啦a梦,CSS3绘制哆啦A梦(带鼠标动画)
  7. 什么是私域?全网最干的干货解析!
  8. 数学实验------级数的性质猜测阿波罗飞船轨迹
  9. 手机端--1.手指拖动touchmove,e.touches[0].clientX
  10. 多普达创建人杨兴平:技术为王的时代已经过去