Dbass

导航

socket实现FTP上传下载功能

'''服务器端'''
1
_author__ = "Dbass" 2 import socketserver 3 import json,os 4 class MyTCPHandler(socketserver.BaseRequestHandler): 5 def get(self,*args): 6 '''发送客户端请求的文件''' 7 cmd_dic= args[0] 8 filename=cmd_dic["filename"] 9 self.request.send(b"200 ok") 10 if os.path.isfile(filename): 11 filesize = str(os.stat(filename).st_size) 12 print(type(filesize)) 13 self.request.send(filesize.encode("utf-8")) 14 self.request.send(b"size ok") 15 f = open(filename, "rb") 16 for line in f: 17 self.request.send(line) 18 else: 19 print(filename, "is not exist") 20 21 def put(self,*args): 22 '''接收客户端文件''' 23 cmd_dic = args[0] 24 filename = cmd_dic["filename"] 25 filesize = cmd_dic["size"] 26 if os.path.isfile(filename): 27 f = open(filename + ".new","wb") 28 else: 29 f = open(filename , "wb") 30 31 self.request.send(b"200 ok") 32 received_size = 0 33 while received_size < filesize: 34 data = self.request.recv(1024) 35 f.write(data) 36 received_size += len(data) 37 else: 38 print("file [%s] has uploaded..." % filename) 39 40 def handle(self): 41 while True: 42 try: 43 self.data = self.request.recv(1024).strip() 44 print("{} wrote:".format(self.client_address[0])) 45 print(self.data) 46 cmd_dic = json.loads(self.data.decode()) 47 action = cmd_dic["action"] 48 if hasattr(self,action): 49 func = getattr(self,action) 50 func(cmd_dic) 51 52 except ConnectionResetError as e: 53 print("err",e) 54 break 55 if __name__ == "__main__": 56 HOST, PORT = "localhost", 9999 57 # Create the server, binding to localhost on port 9999 58 server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler) 59 server.serve_forever()
 '''客户端'''
1
_author__ = "Dbass" 2 import socket 3 import json 4 import os 5 #client.connect(('192.168.16.200',9999)) 6 class FtpClient(object): 7 def __init__(self): 8 self.client = socket.socket() 9 def help(self): 10 msg = ''' 11 ls 12 pwd 13 cd ../.. 14 get filename 15 put filename 16 ''' 17 print(msg) 18 def connect(self,ip,port): 19 self.client.connect((ip, port)) 20 def interactive(self): 21 #self.authenticate() 22 while True: 23 cmd = input(">>").strip() 24 if len(cmd) ==0:continue 25 cmd_str = cmd.split()[0] 26 if hasattr(self,"cmd_%s" % cmd_str): 27 func = getattr(self,"cmd_%s" % cmd_str) 28 func(cmd) 29 else: 30 self.help() 31 def cmd_put(self,*args): 32 cmd_split = args[0].split() 33 if len(cmd_split) >1: 34 filename = cmd_split[1] 35 if os.path.isfile(filename): 36 filesize = os.stat(filename).st_size 37 msg_dic = { 38 "action": "put", 39 "filename":filename, 40 "size": filesize, 41 "overridden":True 42 } 43 self.client.send( json.dumps(msg_dic).encode("utf-8") ) 44 print("send", json.dumps(msg_dic).encode("utf-8")) 45 # 防止粘包,等服务器确认 46 server_response = self.client.recv(1024) 47 f = open(filename,"rb") 48 for line in f: 49 self.client.send(line) 50 else: 51 print("file upload success...") 52 f.close() 53 else: 54 print(filename,"is not exist") 55 def cmd_get(self,*args): 56 '''get IMG_6245.jpg''' 57 cmd_split=args[0].split() 58 if len(cmd_split) >1: 59 filename=cmd_split[1] 60 if os.path.isfile(filename): 61 print("filename has lived") 62 else: 63 msg_dic = { 64 "action": "get", 65 "filename": filename, 66 "overridden": True 67 } 68 self.client.send(json.dumps(msg_dic).encode("utf-8")) 69 print("send", json.dumps(msg_dic).encode("utf-8")) 70 server_response = self.client.recv(1024)# 防止粘包,等服务器确认 71 print(server_response) 72 filesize = int(self.client.recv(1024).decode()) 73 print(filesize) 74 server_response2 = self.client.recv(1024)# 防止粘包,等服务器确认 75 print(server_response2) 76 received_size = 0 77 f = open(filename, "wb") 78 while received_size < filesize: 79 data = self.client.recv(1024) 80 f.write(data) 81 received_size += len(data) 82 else: 83 print("file [%s] has uploaded..." % filename) 84 85 ftp = FtpClient() 86 ftp.connect("localhost",9999) 87 ftp.interactive()

posted on 2017-11-09 09:13  Dbass  阅读(295)  评论(0编辑  收藏  举报