'''服务器端'''
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()