一、客户端
1 # Author:David Liu 2 # Be Happy! 3 4 import socket 5 import hashlib,os,json 6 7 class FtpClient(object): 8 def __init(self,client): 9 self.client=socket.socket() 10 def help(self): 11 print(''' 12 请按照以下格式操作: 13 put 14 get 15 … 16 ''' 17 ) 18 def connect(self,ip,port): 19 self.client = socket.socket() 20 self.client.connect((ip, port)) 21 def interactive(self): 22 #self.authenticate() 23 while True: 24 cmd=input(">>:").strip() 25 if len(cmd)==0:continue 26 cmd_str=cmd.split()[0] 27 if hasattr(self,'cmd_%s'%cmd_str): 28 func=getattr(self,'cmd_%s'%cmd_str) 29 func(cmd) 30 else: 31 self.help() 32 def cmd_put(self,*args): 33 cmd_split=args[0].split() 34 if len(cmd_split)>1: 35 filename=cmd_split[1] 36 if os.path.isfile(filename): 37 filesize=os.stat(filename).st_size 38 msg_dic={ 39 'action':'put', 40 'filename':filename, 41 'size':filesize 42 } 43 self.client.send(json.dumps(msg_dic).encode()) 44 #为了防止粘包,等服务器确认 45 server_response=self.client.recv(1024) 46 f=open(filename,'rb') 47 for line in f: 48 self.client.send(line) 49 else: 50 print(filename,'upload succeed!') 51 f.close() 52 else: 53 print('[%s] is not exit'%filename) 54 def cmd_get(self,*args):#下载还没写 55 pass 56 ftp=FtpClient() 57 ftp.connect('localhost',9999) 58 ftp.interactive()
二、服务器端
1 # Author:David Liu 2 # Be Happy! 3 import socketserver,json,os 4 5 class MyTCPHandler(socketserver.BaseRequestHandler): 6 def put(self,*args): 7 '''接收客户端文件''' 8 cmd_dic=args[0] 9 filename=cmd_dic['filename'] 10 filesize=cmd_dic['size'] 11 if os.path.isfile(filename): 12 f=open(filename+'new','wb') 13 else: 14 f = open(filename, 'wb') 15 16 self.request.send(b"200 ok") 17 received_size=0 18 while received_size<filesize: 19 data=self.request.recv(1024) 20 f.write(data) 21 received_size+=len(data) 22 else: 23 print('file [%s] has uploaded'%filename) 24 25 def handle(self): 26 #和客户端所有的交互都在这里面写 27 while True: 28 try: 29 self.data=self.request.recv(1024).strip() 30 print("{} wrote:".format(self.client_address[0])) 31 print(self.data.decode()) 32 cmd_dic=json.loads(self.data.decode()) 33 action=cmd_dic['action'] 34 if hasattr(self,action): 35 func=getattr(self,action) 36 func(cmd_dic) 37 38 if not self.data: 39 print(self.client_address,"客户端已断开") 40 break 41 self.request.send(self.data.upper()) 42 except ConnectionResetError as e: 43 print("客户端已断开>>--",e) 44 break 45 46 if __name__=="__main__": 47 HOST,PORT="localhost",9999 48 server=socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler) 49 server.serve_forever()
注:用于下载的get方法还没有写
2019年5月24日