文档章节

python 自定义报头 实现大文件传输

o
 osc_g8254g7s
发布于 2019/08/19 19:54
字数 567
阅读 10
收藏 0

精选30+云产品,助力企业轻松上云!>>>

 1 import socket
 2 import json
 3 import struct
 4 
 5 
 6 buffer = 4096
 7 # 每次接收长度
 8 sk = socket.socket()
 9 sk.bind(("127.0.0.1",8080))
10 sk.listen()
11 conn, addr = sk.accept()
12 
13 head_len = conn.recv(4)
14 # 获取包装后的报头长度
15 head_len = struct.unpack("i",head_len)[0]
16 # 解包报头长度
17 json_head = conn.recv(head_len)
18 # 接收报头
19 head = json.loads(json_head)
20 print(head)
21 # 反序列化报头
22 filesize = head["filesize"]
23 # 获取文件大小
24 n_filesize = filesize
25 # 现在剩余未传输文件大小
26 filename = head["filename"]
27 # 获取文件名称
28 with open(filename,"wb") as f:
29     # 打开文件
30     while True:
31         print(str(round(100 - n_filesize/filesize * 100,2)) + "%")
32         # 显示进度
33         if n_filesize >= buffer:
34             # 文件剩余大小大于等于每次传输的大小
35             content = conn.recv(buffer)
36             # 接收buffer长度的数据
37             f.write(content)
38             # 将接收的数据写入
39             n_filesize -= buffer
40             # 文件大小减去本次传输的大小
41         else:
42             # 文件剩余大小不足buffer
43             # 将剩余文件一次性传完
44             content = conn.recv(n_filesize)
45             # 接收剩余文件
46             f.write(content)
47             # 将接收的数据写入文件
48             print("100%")
49             break
50 conn.close()
51 sk.close()
server/接收端
 1 import socket
 2 import struct
 3 import json
 4 import os
 5 
 6 
 7 buffer = 4096
 8 # 每次send发送的大小
 9 sk = socket.socket()
10 sk.connect(("127.0.0.1",8080))
11 
12 head = {"filepath":"F:\工具",
13         "filename":"nox_setup_v6.2.7.1_full.exe",
14         "filesize":None
15         }
16 # 自定义报头
17 filepath = os.path.join(head["filepath"],head["filename"])
18 # 拼接文件路径
19 filesize = os.path.getsize(filepath)
20 head["filesize"] = filesize
21 n_filesize = filesize
22 # 获取文件大小
23 json_head = json.dumps(head).encode("utf8")
24 # 将报头序列化并转码成utf8
25 head_len = len(json_head)
26 # 获取报头文件长度
27 head_len = struct.pack("i",head_len)
28 # 将报头长度包装为四个字节
29 # 参数"i"代表要包装的是数字int类型
30 sk.send(head_len)
31 sk.send(json_head)
32 with open(filepath,"rb") as f:
33     # 打开文件
34     while True:
35         print(str(round(100 - n_filesize/filesize * 100,2)) + "%")
36         # 显示进度
37         if n_filesize >= buffer:
38             # 如果文件还大于buffer,则按buffer大小传输
39             content = f.read(buffer)
40             # 读取buffer大小的内容
41             sk.send(content)
42             # 发送文件
43             n_filesize -= buffer
44             # 文件总大小减去本次发送的大小
45         else:
46             content = f.read(n_filesize)
47             # 读取剩余文件
48             sk.send(content)
49             # 发送剩余文件
50             print("100%")
51             break
52 sk.close()
client/发送端

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
TCP解决粘包+传输文件

解决粘包 只有TCP有粘包现象,UDP永远不会粘包 粘包原因 本质是不知道要收多少 1.tcp一次收的过多,需要下次才接收完,造成粘包 2.tcp发到内核态内存是几条内容较少的消息,TCP有Nigon算法,...

osc_1z8ghska
2019/08/14
3
0
万物互联之~网络编程基础篇

入门篇¶ 官方文档:https://docs.python.org/3/library/ipc.html(进程间通信和网络) 实例代码:https://github.com/lotapp/BaseCode/tree/master/python/6.net 1.概念¶ 1.1.Python方向¶...

osc_5n29qf0u
2018/11/06
2
0
套接字(socket)

socket(套接字):   是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写 和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程...

osc_ry2xcr8z
2019/08/07
1
0
Python3 与 C# 网络编程之~ 网络基础篇

最新版本查看:https://www.cnblogs.com/dotnetcrazy/p/9919202.html 入门篇 官方文档:https://docs.python.org/3/library/ipc.html(进程间通信和网络) 实例代码:https://github.com/lo...

毒逆天
2018/11/07
0
0
五行星“学编程"公测版发布

一、功能介绍: 1、学Python: (1)单行数值Python计算器功能——Python计算器。 (2)扫选区域Python执行功能——该功能独创,充分发挥Python的优越性,对学习Python有巨大帮助。 (3)整篇...

e国阳光
07/06
4
0

没有更多内容

加载失败,请刷新页面

加载更多

asp.net core之NLog

NuGet添加 NLog.Web.AspNetCore。 <PackageReference Include="Microsoft.AspNetCore.App" /> 添加配置文件 新建一个文件nlog.config(建议全部小写,linux系统中要注意), 并右键点击其属性......

一介草民Coder
51分钟前
23
0
.NET中的struct和class有什么区别? - What's the difference between struct and class in .NET?

问题: .NET中的struct和class有什么区别? 解决方案: 参考一: https://stackoom.com/question/3OT/NET中的struct和class有什么区别 参考二: https://oldbug.net/q/3OT/What-s-the-differ...

富含淀粉
今天
23
0
android:layout_weight是什么意思? - What does android:layout_weight mean?

问题: I don't understand how to use this attribute. 我不明白如何使用这个属性。 Can anyone tell me more about it? 谁能告诉我更多关于它的事情? 解决方案: 参考一: https://stacko...

javail
今天
17
0
CSS背景不透明度[重复] - CSS Background Opacity [duplicate]

问题: This question already has an answer here: 这个问题已经在这里有了答案: How do I give text or an image a transparent background using CSS? 如何使用CSS为文本或图像提供透明背...

fyin1314
今天
31
0
node http 获取gb2312网页如何转为utf8

最初,我想当然认为是下述做法,但被证明是错误的 const http = require('http'), iconv = require('iconv-lite');const url = 'http://xxx';http.get(url, function(res) { var bo......

高延
今天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部