python3 FTP上传下载的代码简易版

即便是视频文件,也是可以按行来读取的,也可以readline,也可以for循环,但是读取出来的数据大小就不固定了,影响效率,有可能读的比较小,
也可能很大,像视频文件一般都是一行的二进制字节流。
所有我们可以用read,设定一个一次读取内容的大小,一边读一边发,一边收一边写
-------------------------------------ftp_server.py-------------------------------------
#
coding:utf-8 import json import socket import struct server = socket.socket() ip_port = ("127.0.0.1", 8001) buffer = 1024 server.bind(ip_port) server.listen(5) conn, addr = server.accept() header_len = conn.recv(4) # 接收报头长度 header_bytes = conn.recv(struct.unpack('i', header_len)[0]) # 接收报头 header = json.loads(header_bytes.decode("utf-8")) # 报头解码->反序列化 file_size = header['filesize'] # 文件的大小 print(file_size, buffer) with open(header['filename'], "wb") as f: while file_size: if file_size >= buffer: f.write(conn.recv(buffer)) file_size -= buffer print(file_size, buffer) else: f.write(conn.recv(buffer)) print(file_size, buffer) break conn.close() server.close()

-------------------------------------ftp_client.py-------------------------------------
#
coding:utf-8 import os import json import struct import socket client = socket.socket() ip_port = ("127.0.0.1", 8001) client.connect(ip_port) buffer = 1024 header = { # 报头为dict类型 "filename": "day08.md", "filepath": r"F:\2019老男孩周末26期\day08\课下练习", "filesize": 0, } file_path = os.path.join(header['filepath'], header['filename']) file_size = os.path.getsize(file_path) header['filesize'] = file_size header_json = json.dumps(header) # 报头序列化为json字符串 header_bytes = header_json.encode("utf-8") # 报头编码为bytes类型 client.send(struct.pack('i', len(header_bytes))) # 发送4个字节的报头大小 client.send(header_bytes) # 发送报头 print(file_size, buffer) with open(file_path, "rb") as f: while file_size: if file_size >= buffer: client.send(f.read(buffer)) file_size -= buffer print(file_size, buffer, "第一次或中间的") else: client.send(f.read(buffer)) print(file_size, buffer, "最后一次") break client.close()
 
 

 

 

转载于:https://www.cnblogs.com/lilyxiaoyy/p/10933828.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值