1.服务端
import os
import json
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
def put(self, *args):
cmd_dic = args[0]
filename = cmd_dic["filename"]
filesize = cmd_dic["size"]
if os.path.isfile(filename):
f = open(filename + ".new", "wb")
else:
f = open(filename, "wb")
self.request.send(b"200 ok")
received_size = 0
while received_size < filesize:
data = self.request.recv(1024)
f.write(data)
received_size += len(data)
else:
f.close()
print("file [%s] has uploaded..." % filename)
def handle(self):
while True:
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"]
if hasattr(self, action):
func = getattr(self, action)
func(cmd_dic)
except ConnectionResetError as e:
print("error", e)
break
if __name__=="__main__":
HOST, PORT = "0.0.0.0", 22222
server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
2.客户端
import socket, os
import json
class FtpClient(object):
def __init__(self):
self.client = socket.socket()
def connect(self, ip, port):
self.client.connect((ip, port))
def interactive(self):
while True:
cmd = input(">>:").strip()
if len(cmd) == 0: continue
cmd_str = cmd.split()[0]
if hasattr(self, "cmd_%s" % cmd_str):
func = getattr(self, "cmd_%s" % cmd_str)
func(cmd)
else:
self.help()
def help(self):
msg = """
ls
pwd
cd
get filename
wget filename
"""
def cmd_put(self, *args):
cmd_split = args[0].split()
if len(cmd_split) > 1:
filename = cmd_split[1]
if os.path.isfile(filename):
filesize = os.stat(filename).st_size
msg_dic = {
"action": "put",
"filename": filename,
"size": 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:
self.client.send(line)
else:
print("file upload success...")
f.close()
else:
print(filename, "is not exist")
def cmd_wget(self):
pass
ftp = FtpClient()
ftp.connect("localhost", 22222)
ftp.interactive()
3.使用
put filename
标签:__,文件,socketserver,self,cmd,filename,dic,上传,def From: https://www.cnblogs.com/circlecircle/p/18486722