# Author : Xuefengimport socketserver
import json, os
classMyTCPHandler(socketserver.BaseRequestHandler):defupload(self,*args):'''接受客户端文件'''
cmd_dic = args[0]
filename = cmd_dic["filename"]
filesize = cmd_dic["filesize"]print(filename,filesize)if os.path.isfile(filename):
f =open(filename+".new","wb")else:
f =open(filename,"wb")
self.request.send(b"200")
recieved_size =0while recieved_size < filesize:
data = self.request.recv(1024)
f.write(data)
recieved_size +=len(data)else:print("file %s has uploaded..."% filename)defhandle(self):whileTrue:try:
self.data = self.request.recv(1024).strip()print("{} wrote".format(self.client_address[0]))print(self.data)
cmd_dic = json.loads(self.data.decode())
action = cmd_dic["action"]ifhasattr(self,action):
func =getattr(self, action)
func(cmd_dic)except ConnectionResetError as e:print("err: ", e)breakif __name__ =='__main__':
HOST, PORT ="localhost",9999# Create the server, binding to localhost on port 9999
server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)"""
Activate the server: This will keeping running until
you interrupt the program with Ctrl-C
"""
server.serve_forever()
客户端的实现
# Author : Xuefengimport socket
import os
import json
classFtpClient(object):def__init__(self):
self.client = socket.socket()defhelp(self):
msg ="""
ls
pwd
cd ../..
upload filename
load filename
"""defconnect(self):
self.client.connect(("localhost",9999))print("connect:","localhost")definteractive(self):# self.authenticatewhileTrue:
cmd =input(">>").strip()iflen(cmd)==0:continue
cmd_str = cmd.split()[0]ifhasattr(self,"%s"% cmd_str):
func =getattr(self,"%s"% cmd_str)
func(cmd)else:
self.help()defupload(self,*args):
cmd_split = args[0].split()iflen(cmd_split)>1:
filename = cmd_split[1]if os.path.isfile(filename):
filesize = os.stat(filename).st_size
msg_dic ={"action":"upload","filename": filename,"filesize": filesize,"overridden":True}
self.client.send(json.dumps(msg_dic).encode("utf-8"))# 防止黏包,等服务器确认
server_response = self.client.recv(1024)
f =open(filename,"rb")for line in f:# print("start")
self.client.send(line)else:print("upload have done")
f.close()else:print(filename,"is not exist.")defload(self):pass
ftp = FtpClient()
ftp.connect()
ftp.interactive()