【Python网络开发-黏包问题(三)黏包问题的解决办法】
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网络开发-黏包问题(三)黏包问题的解决办法】相关推荐
- windows phone 网络开发三部曲(一)各种包的各种抓法
首先感谢大家对我上一篇博客的支持,让我也体验了一把上榜的感觉. 这无疑是对我这个刚刚打算,认真写写博客的人的莫大的鼓励,再次感谢(鞠躬)!! 接下来想和大家分享一些关于windows phone网络开 ...
- 5 个 Android 开发中比较常见的内存泄漏问题及解决办法
Android开发中,内存泄漏是比较常见的问题,有过一些Android编程经历的童鞋应该都遇到过,但为什么会出现内存泄漏呢?内存泄漏又有什么影响呢? 在Android程序开发中,当一个对象已经不需要再 ...
- Python在指定环境下安装第三方库的报错解决办法
Python在指定环境下安装第三方库的报错解决办法 在python安装第三方库时,如果直接打开cmd命令提示符,并输入下列安装命令,则会默认安装在base环境下 但base环境下的包新建的虚拟环境是无 ...
- Xamarin开发安装Visual Studio 2015 update2报错的解决办法
Xamarin开发安装Visual Studio 2015 update2报错的解决办法 错误信息:update 2 requires a member of the visual studio 20 ...
- windows环境下Eclipse开发MapReduce程序遇到的四个问题及解决办法
按此文章<Hadoop集群(第7期)_Eclipse开发环境设置>进行MapReduce开发环境搭建的过程中遇到一些问题,饶了一些弯路,解决办法记录在此: 文档目的: 记录windows环 ...
- 前端面试查漏补缺--(三) 跨域及常见解决办法
前言 本系列最开始是为了自己面试准备的.后来发现整理越来越多,差不多有十二万字符,最后决定还是分享出来给大家. 为了分享整理出来,花费了自己大量的时间,起码是只自己用的三倍时间.如果喜欢的话,欢迎收藏 ...
- ANDROID开发java.lang.NoClassDefFoundError: com.baidu.location.LocationClient的解决办法
ANDROID开发java.lang.NoClassDefFoundError: com.baidu.location.LocationClient的解决办法 java.lang.NoClassDe ...
- Python使用opencv打开笔记本摄像头时遇到的问题及解决办法
Python使用opencv打开笔记本摄像头时遇到的问题及解决办法 最近在学习python,想用opencv做个人脸检测,打开笔记本摄像头时遇到了问题.摄像头总是闪一下就关闭,并提示一行警告([ WA ...
- GTASA圣安地列斯大量高清贴图包导致游戏崩溃闪退的解决办法
GTASA圣安地列斯大量高清贴图包导致游戏崩溃闪退的解决办法 记录博文 情况说明 在安装了很多不同的 HD 纹理包之后(例如美化包)&驾驶或飞行了大约10分钟,游戏导致崩溃.不管用啥 stre ...
- 【亲测】Parallels Desktop 16 / 17在MacOs Big Sur / Monterey下网络初始化失败:您的虚拟机将继续正常运作 解决办法
场景: Mac升级Big Sur / Monterey后,然后再升级Parallels Desktop到16/17版本后,Parallels Desktop开启windows或者其他虚拟机就出现 网络 ...
最新文章
- 计算机导论简答芯片,吉大计算机 - 计算机导论简答题 (2011级)
- android应用兼容报告,手机资讯导报:华为发布国内首份Android7.0应用兼容报告
- 根据文法画出语法树_编译工程5:语法分析(3)
- leetcode340. 至多包含 K 个不同字符的最长子串
- 浏览器解析JavaScript的原理
- yii2.0框架debug模式
- 程序员在服务器安“炸弹”格式化原公司内部资料!
- 64. 雇员管理系统
- sqluldr2用法
- ​「5G消息」的最新消息
- 常见的几种加密方法和实现
- [JS]JSON字符串与JS对象的转换
- c语言cast的用法,static_cast 用法
- 濉溪海潮计算机学校校长是谁,濉溪县城关中心学校举办退休教师欢送会
- 读淘宝页面字节流提取宝贝图片地址宝贝标题宝贝价格
- 视频教程-怎么架构生产数据库--生产数据库优化的一种方式-MySQL
- H5网页跳转至微信小程序
- 关于个人的第二个程序——黑白棋续
- python二级考试细节整理
- 同学,同事,KTV聚会的小游戏
热门文章
- 开源JAVA版CMDB,CMDB到底如何建设?
- [免费专栏] Android安全之利用JDB调试Android应用程序(动态代码注入技术)
- mosh 基于UDP方式ssh连接 不怕掉线
- 连接手表_一图看懂小米手表/Color连接iPhone/安卓手机的功能差别
- 三张图搞透第一范式(1NF)、第二范式(2NF)和第三范式(3NF)的区别
- 如何用手机HTML制作哆啦a梦,CSS3绘制哆啦A梦(带鼠标动画)
- 什么是私域?全网最干的干货解析!
- 数学实验------级数的性质猜测阿波罗飞船轨迹
- 手机端--1.手指拖动touchmove,e.touches[0].clientX
- 多普达创建人杨兴平:技术为王的时代已经过去