#在网络上面传输的数据叫数据包,数据包里面的数据叫报文,报文都有报头。
#报头可以包含文件路径、文件大小、文件名称等等。
#当数据比较长,一次性发送会报错,需要分多次发送。
#client端上传数据到server端,server端下载数据: #client端:
import socket
import os
import json
import struct
sk = socket.socket()
sk.connect(('127.0.0.1',9008))
buffer = 4096 #定制报头
head = {'directory':r'D:\python教学视频\day32', #字符串前面加r,表示原生字符串,反斜杠\不起转义作用。
'name':r'06 python fullstack s9day32 struct模块定制报头ftp实践.mp4',
'size':None}
file_path = os.path.join(head['directory'],head['name']) #文件路径=目录+名称
print(file_path)#D:\python教学视频\day32\06 python fullstack s9day32 struct模块定制报头ftp实践.mp4
filesize = os.path.getsize(file_path) #文件大小,通过文件路径得到文件大小。
print(filesize)
head['size'] = filesize #把字典的值None修改为filesize。 #报头是字典,先转为str,再转为bytes才能通过网络发送:
json_head = json.dumps(head)#字典转为字符串
bytes_head = json_head.encode('utf-8')#字符串转为字节bytes #发送含有报头长度的包和报头:
pack_len = struct.pack('i',len(bytes_head))#打包bytes类型的报头的长度。
sk.send(pack_len) #先发含有报头长度的包
sk.send(bytes_head) #再发bytes类型的报头 #发送报文:当数据比较长,一次性发送会报错,需要分多次发送。
with open(file_path,'rb') as f: #encoding='utf-8'不需要写,因为读取的数据就是bytes类型,不需要encoding把它编码为bytes类型
while filesize > 0:
if filesize > buffer:
content = f.read(buffer) #每次读取4096个字节的内容,然后发送过去。
sk.send(content)
filesize -= buffer
else:
content = f.read(filesize)
sk.send(content)
break sk.close() #server端:
import socket
import struct
import json
buffer = 4096
sk = socket.socket()
sk.bind(('127.0.0.1',9008))
sk.listen()
conn,addr = sk.accept() pack = conn.recv(4) #接收含有报头长度的包,接收4个字节的包。
unpack = struct.unpack('i',pack) #解包
json_head = conn.recv(unpack[0]).decode('utf-8') #接收报头长度大小的内容,解码为str
head = json.loads(json_head) #str转为字典
filesize = head['size'] with open('教学视频.mp4','wb') as f: #在跟本py文件同一目录下创建 教学视频.mp4 文件。
while filesize > 0:
if filesize >= buffer:
content = conn.recv(buffer)
f.write(content)
filesize -= buffer
else:
content = conn.recv(filesize)
f.write(content)
break conn.close()
sk.close()

最新文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解
  2. 关于spark的一些简单认识。
  3. Timer和DPC
  4. Some Useful Property Settings Explained Of Oracle Forms
  5. struts中的数据校验
  6. Android monkey介绍
  7. myqltransactionRollbackexception deadlock found when trying to get lock
  8. 《TCP-IP详解卷2:实现》【PDF】下载
  9. 洛谷P5219 无聊的水题 I [prufer序列,生成函数,NTT]
  10. APACHE如何里一个站点绑定多个域名?用ServerAlias servername
  11. oracle 中从某天到某天一天一次执行某个函数
  12. [PHP] Yaf框架的简单安装使用
  13. bzoj3751 / P2312 解方程
  14. Python unittest第一篇:基础入门+命令行编译
  15. 去掉a标签的虚线框,避免出现奇怪的选中区域
  16. 2017中国大学生程序设计竞赛 - 女生专场 Happy Necklace(递推+矩阵快速幂)
  17. poj1860 Currency Exchange(spfa判断正环)
  18. SQLAlchemy的使用---M2M多对多关系
  19. Spark大数据处理 之 动手写WordCount
  20. ReactiveCocoa实战: 模仿 "花瓣",重写 LeanCloud Rest Api的iOS REST Client.

热门文章

  1. Neo4j--节点的增删查改基本用法
  2. C++11多线程访问时候的数据保护实例
  3. DRF框架之序列化器初体验
  4. linux 替换jdk指定jar包
  5. 干货 | 利用京东云Web应用防火墙实现Web入侵防护
  6. iOS 内购相关
  7. 记录一次URL中有特殊字符怎么处理?
  8. 29. docker swarm 创建 三个节点 swarm 的集群
  9. R语言 批量下载财务报表
  10. 吴裕雄--天生自然 JAVA开发学习:变量类型