ftp上传小示例

客户端

 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)

 

上一篇:Linux C套接字:在recv调用时被阻止


下一篇:根据TCP的C函数