客户端
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)