ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ftp上传小示例

2019-08-03 10:04:55  阅读:188  来源: 互联网

标签:info ftp struct 示例 recv len json file 上传


客户端

 1 import socket
 2 import os
 3 import json
 4 import struct
 5 #上传文件即发送我的数据,服务端来保存,保存的时候需要按照我的描述信息来
 6 #所以需要先发送文件的描述信息:文件名和文件大小
 7 
 8 client = socket.socket()
 9 client.connect(('121.195.167.34',8004))
10 
11 file_size = os.path.getsize(r'E:\bilibili下载\老男孩所有正式项目\粘包解决2服务端.py')
12 
13 #先发送文件的描述信息:文件名和文件大小
14 file_info = {'filename':'粘包解决2服务端.py',
15              'file_size':file_size}
16 
17 #发送需要bytes,字典无法直接过去,需要json先转成json字符串再把字符串转bytes
18 file_str = json.dumps(file_info)
19 file_info_bytes = file_str.encode('utf-8')
20 
21 #为了防止粘包,先把文件描述信息的长度打包成4字节长度的内容,
22 #再把这个4字节内容和真正的文件的描述信息打包发送
23 info_len = len(file_info_bytes)
24 info_len_struct = struct.pack('i',info_len)
25 client.send(info_len_struct + file_info_bytes)
26 
27 
28 #准备发送文件真实数据,因为此时服务端已经准备好了接受文件信息里提到的文件长度
29 sum = 0
30 with open('粘包解决2服务端.py','rb') as f:
31     while sum < file_size:   #循环结束条件
32         #每次读取的长度
33         every_read = f.read(5)
34         sum += len(every_read)
35         client.send(every_read)
36         #累加统计文件每次读取的累计值

服务端

 1 import socket
 2 import struct
 3 import json
 4 
 5 server = socket.socket()
 6 server.bind(('121.195.167.34',8004))
 7 server.listen()
 8 conn,addr = server.accept()
 9 
10 #首先接受描述信息的长度
11 file_struct = conn.recv(4)
12 file_info_len = struct.unpack('i',file_struct)[0]
13 
14 
15 #接受对应的长度的内容,将其转化为字典模式的描述信息
16 file_info_bytes = conn.recv(file_info_len)
17 file_info_json = file_info_bytes.decode('utf-8')
18 file_info = json.loads(file_info_json)
19 21 recv_sum = 0
22 
23 file_path = 'E:\\bilibili下载'+ '\\' + file_info['filename']
24 
25 with open(file_path,'wb') as f:
26     while recv_sum < file_info['file_size']:
27         every_recv = conn.recv(5)
28         f.write(every_recv)
29         recv_sum += len(every_recv)

 

标签:info,ftp,struct,示例,recv,len,json,file,上传
来源: https://www.cnblogs.com/shachengcc1/p/11293868.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有