python socketserver ftp上传功能
一.socketserver用于多个客户端访问同一个服务端
客户端
1 import socket 2 3 client = socket.socket() 4 5 ip_port = ('127.0.0.1',8001) 6 7 client.connect(ip_port) 8 9 while 1: 10 msg = input('客户端说>>>') 11 12 client.send(msg.encode('utf-8')) 13 14 from_server_msg = client.recv(1024) 15 16 print(from_server_msg.decode('utf-8'))
服务端
1 import socketserver 2 3 class Myserver(socketserver.BaseRequestHandler): 4 5 def handle(self): 6 while 1: 7 from_client_msg = self.request.recv(1024) 8 9 print(from_client_msg.decode('utf-8')) 10 msg = input('服务端说:') 11 self.request.send(msg.encode('utf-8')) 12 13 14 if __name__ == '__main__': 15 16 ip_port = ('127.0.0.1',8001) 17 18 server = socketserver.ThreadingTCPServer(ip_port,Myserver) 19 20 server.serve_forever()
二.ftp上传
客户端
1 import os 2 import socket 3 import json 4 import struct 5 6 client = socket.socket() 7 ip_port = ('127.0.0.1', 8001) 8 client.connect(ip_port) 9 10 # 统计文件大小 11 file_size = os.path.getsize(r'D:\python_workspace_s18\day 29socketserver ftp功能简单讲解\aaa.mp4') 12 13 # 统计文件描述信息,给服务端,服务端按照我的文件描述信息来保存文件,命名文件等等,现在放到一个字典里面了 14 file_info = { 15 'file_name': 'aaa.mp4', 16 'file_size':file_size 17 } 18 19 # 由于字典无法直接转换成bytes类型的数据,所以需要json来讲字典转换为json字符串,在吧字符串转换为字节类型的数据进行发送 20 21 # json.dumps是将字典转换成json字符串的方法 22 file_info_json = json.dumps(file_info) 23 24 # 将字符串转换成bytes类型的数据 25 file_info_byte = file_info_json.encode('utf-8') 26 27 # 为了防止黏包现象,将文件描述信息的长度打包后和文件的描述信息的数据一起发送过去 28 data_len = len(file_info_byte) 29 data_len_struct = struct.pack('i',data_len) 30 31 # 发送文件描述信息 32 client.send(data_len_struct + file_info_byte) 33 34 35 # 定义一个变量 = 0 ,作为每次读取文件长度的累计值 36 sum = 0 37 38 with open('aaa.mp4','rb') as f: 39 while file_size > sum: 40 # 每次读取的文件内容,每次读取1024B大小的数据 41 erver_read_data = f.read(1024) 42 # 将sum累加,统计长度 43 sum += len(erver_read_data) 44 # 将每次读取的文件的真实数据发送给服务端 45 client.send(erver_read_data)
服务端
1 import json 2 import socket 3 import struct 4 5 server = socket.socket() 6 7 ip_port = ('127.0.0.1', 8001) 8 9 server.bind(ip_port) 10 11 server.listen() 12 13 conn,addr = server.accept() 14 15 # 首先接收文件的描述信息的长度 16 struct_data_len = conn.recv(4) 17 data_len = struct.unpack('i', struct_data_len)[0] 18 19 # 打印长度 20 print('data_len',data_len) 21 22 # 通过文件信息的长度将文件描述信息全部接收 23 file_info_bytes = conn.recv(data_len) 24 25 # 将文件描述信息转换为字典类型,以便操作 26 27 file_info_json =file_info_bytes.decode('utf-8') 28 29 # 将字符串转换成字典 30 file_info_dict = json.loads(file_info_json) 31 32 # 打印字典 33 print(file_info_dict) 34 35 # 统计每次接收的累积长度 36 recv_sum = 0 37 38 #根据文件描述信息,指定文件路径和文件名称 39 file_path = 'D:\python_workspace_s18\day 29socketserver ftp功能简单讲解\jj' + '\\' + file_info_dict['file_name'] 40 41 42 #接收文件的真实数据 43 with open(file_path,'wb') as f: 44 # 循环接收,循环结束的依据是文件描述信息中文件的大小,也是通过一个初始值为0的变量来统计 45 while file_info_dict['file_size'] > recv_sum: 46 every_recv_data = conn.recv(1024) 47 recv_sum +=len(every_recv_data) 48 f.write(every_recv_data)