python socketserver ftp上傳功能
阿新 • • 發佈:2019-01-07
一.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 16print(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 json4 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)