1、配置文件
IP_PORT = ('localhost', 50009)
2、client文件
1 import socket 2 from config.settings import IP_PORT 3 import os 4 5 class FtpSocketClient(object): 6 def __init__(self): 7 self.ftpclient = socket.socket() 8 self.ftpclient.connect(IP_PORT) 9 server_reply = self.ftpclient.recv(1024) 10 print(str(server_reply, encoding='utf-8')) 11 12 def updata(self, path): 13 """上传文件""" 14 print('准备发送文件') 15 file_size = os.path.getsize(path) 16 data = '{0}|{1}|{2}'.format('accpet', path, file_size) 17 self.ftpclient.send(bytes(data, encoding='utf-8')) 18 server_reply = self.ftpclient.recv(1024) 19 if str(server_reply, encoding='utf-8') == 'ok': 20 size = 0 21 with open('test.txt', 'rb') as f: 22 while size < file_size: 23 file_data = f.read(500) 24 self.ftpclient.send(file_data) 25 size += len(file_data) 26 else: 27 print('文件发送完成') 28 29 def download(self, path): 30 """下载文件""" 31 if os.path.exists(path): 32 with open(path, 'ab') as f: 33 p = f.tell() 34 data = '{0}|{1}|{2}'.format('recv', path, p) 35 self.ftpclient.sendall(bytes(data, encoding='utf-8')) 36 file_size = str(self.ftpclient.recv(1024), encoding='utf-8') 37 if p >= int(file_size): 38 print('文件已经完整存在') 39 return 40 else: 41 self.ftpclient.send(bytes('ok', encoding='utf-8')) 42 while f.tell() != int(file_size): 43 file_data = self.ftpclient.recv(500) 44 f.write(file_data) 45 else: 46 print('文件接收完成!') 47 else: 48 data = '{0}|{1}|{2}'.format('recv', path, 0) 49 self.ftpclient.sendall(bytes(data, encoding='utf-8')) 50 file_size = str(self.ftpclient.recv(1024), encoding='utf-8') 51 with open(path, 'wb') as f: 52 self.ftpclient.send(bytes('ok', encoding='utf-8')) 53 size = 0 54 while size != int(file_size): 55 file_data = self.ftpclient.recv(500) 56 f.write(file_data) 57 size += len(file_data) 58 else: 59 print('文件接收完成!') 60 61 def close(self): 62 self.ftpclient.close() 63 64 65 66 if __name__ == '__main__': 67 myClient = FtpSocketClient() 68 # myClient.updata('test.txt') 69 myClient.download('test.txt') 70 myClient.close()
3、server文件
1 import socketserver 2 from config.settings import IP_PORT 3 import os 4 5 6 7 8 class MyTCPHandler(socketserver.BaseRequestHandler): 9 def handle(self): 10 print('New Conn:', self.client_address) 11 self.request.send(bytes('链接成功', 'utf-8')) 12 while True: 13 try: 14 data = self.request.recv(1024) 15 except: 16 data = '' 17 if not data: 18 break 19 cmd_list = data.decode().split('|') 20 if hasattr(MyTCPHandler, cmd_list[0]): 21 fun = getattr(MyTCPHandler, cmd_list[0]) 22 fun(self, cmd_list[1:]) 23 else: 24 print('cmd is error') 25 26 def accpet(self, file_info): 27 """收文件""" 28 with open(file_info[0], 'wb') as f: 29 self.request.send(bytes('ok', encoding='utf-8')) 30 size = 0 31 while size != int(file_info[1]): 32 file_data = self.request.recv(500) 33 f.write(file_data) 34 size += len(file_data) 35 else: 36 print('文件接收完成!') 37 38 39 def recv(self, path): 40 """发文件""" 41 p = os.path.join(os.getcwd(), path[0]) 42 if os.path.exists(p): 43 file_size = os.path.getsize(p) 44 self.request.sendall(bytes(str(file_size), encoding='utf-8')) 45 server_reply = self.request.recv(1024) 46 if str(server_reply, encoding='utf-8') == 'ok': 47 size = int(path[1]) 48 with open('test.txt', 'rb') as f: 49 f.seek(size) 50 while size < file_size: 51 file_data = f.read(500) 52 self.request.send(file_data) 53 size += len(file_data) 54 else: 55 print('文件发送完成') 56 else: 57 print('文件不存在') 58 59 if __name__ == '__main__': 60 server = socketserver.ThreadingTCPServer(IP_PORT, MyTCPHandler) 61 server.serve_forever()