# 服务端 import json import socket import struct server = socket.socket() server.bind(('127.0.0.1',8001)) server.listen() conn,addr = server.accept() #首先接收文件的描述信息的长度 struct_data_len = conn.recv(4) data_len = struct.unpack('i',struct_data_len)[0] # 通过文件信息的长度将文件的描述信息全部接收 print('data_len>>>',data_len) file_info_bytes = conn.recv(data_len) #将文件描述信息转换为字典类型,以便操作 file_info_json = file_info_bytes.decode('utf-8') file_info_dict = json.loads(file_info_json) #{'file_name': 'aaa.mp4', 'file_size': 24409470} print(file_info_dict) #统计每次接收的累计长度 recv_sum = 0 #根据文件描述信息,指定文件路径和文件名称 file_path = 'D:s18jj' + '\' + file_info_dict['file_name'] #接收文件的真实数据 with open(file_path,'wb') as f: #循环接收,循环结束的依据是文件描述信息中文件的大小,也是通过一个初始值为0的变量来统计 while recv_sum < file_info_dict['file_size']: every_recv_data = conn.recv(1024) recv_sum += len(every_recv_data) f.write(every_recv_data)
# 客户端 import os import socket import json import struct client = socket.socket() client.connect(('127.0.0.1',8001)) #统计文件大小 file_size = os.path.getsize(r'D:python_workspace_s18day029aaa.mp4') #统计文件描述信息,给服务端,服务端按照我的文件描述信息来保存文件,命名文件等等,现在放到一个字典里面了 file_info = { 'file_name':'aaa.mp4', 'file_size':file_size, } #由于字典无法直接转换成bytes类型的数据,所以需要json来将字典转换为json字符串.在把字符串转换为字节类型的数据进行发送 #json.dumps是将字典转换为json字符串的方法 file_info_json = json.dumps(file_info) #将字符串转换成bytes类型的数据 file_info_byte = file_info_json.encode('utf-8') #为了防止黏包现象,将文件描述信息的长度打包后和文件的描述信息的数据一起发送过去 data_len = len(file_info_byte) data_len_struct = struct.pack('i',data_len) #发送文件描述信息 client.send(data_len_struct + file_info_byte) #定义一个变量,=0,作为每次读取文件的长度的累计值 sum = 0 #打开的aaa.mp4文件,rb的形式, with open('aaa.mp4','rb') as f: #循环读取文件内容 while sum < file_size: #每次读取的文件内容,每次读取1024B大小的数据 every_read_data = f.read(1024) #将sum累加,统计长度 sum += len(every_read_data) #将每次读取的文件的真实数据返送给服务端 client.send(every_read_data)