开发简单的FTP:1. 用户登陆2. 上传/下载文件put/get3. 不同用户家目录不同home4. 查看当前目录下文件ls5. 充分使用面向对象知识目录:
1 import os,socket,optparse,json,time
2
3 STATUS_CODE =
{
4 200 :
"操作成功",
5 601 :
'操作失败'
6 }
7
8 class FTPClient(object):
9 def __init__(self):
10 self.parser =
optparse.OptionParser()
11 self.parser.add_option(
'-H',
'--host', dest=
'host', help=
'host of server')
12 self.parser.add_option(
'-P',
'--port',type=
'int',dest=
'port',help=
'port of server')
13 self.parser.add_option(
'-u',
'--username',dest=
'username',help=
'username')
14 self.parser.add_option(
'-p',
'--password',dest=
'password',help=
'password')
15 (self.options,self.args) =
self.parser.parse_args()
16 self.verify_args()
17 self.make_connection()
18 self.header =
{}
19
20 def make_connection(self):
21 self.sock =
socket.socket()
22 self.sock.connect((self.options.host,self.options.port))
23
24 def verify_args(self):
25 if self.options.host
and self.options.port:
26 if self.options.port > 0
and self.options.port<= 65535
:
27 if self.options.username
and self.options.password:
28 return True
29 else:
30 exit(
'check your username and password')
31 else:
32 exit(
"worry Port!")
33
34 else:
35 exit(
'Please check your host and port! They can not be null!')
36
37 def authenticate(self):
38 '''登陆验证'''
39 # print('authenticating.........')
40 # print(self.get_auth_result(self.options.username,self.options.password).get('code'))
41 if self.get_auth_result(self.options.username,self.options.password).get(
'code') == 200
:
42 self.header = {
'username':self.options.username}
43 return True
44 else:
45 raise Exception(
'worry username or password!')
46 # retry_count = 0
47 # while retry_count < 3:
48 # user = input("username>>>").strip()
49 # password = input("password>>>").strip()
50 # self.get_auth_result(user,password)
51 # else:
52 # retry_count += 1
53 def get_auth_result(self,username,password):
54 data =
{
55 'action' :
'auth',
56 'username' : username,
57 'password' : password
58 }
59 # print(data)
60 self.sock.sendall(json.dumps(data).encode())
61 # print('send sucessfully')
62 # print(self.get_response())
63 # print(type(self.get_response()))
64 return self.get_response()
65
66 def get_response(self):
67 '''获取服务器结果'''
68 recv = self.sock.recv(1024
)
69 recv =
json.loads(recv.decode())
70 # print(recv)
71 print(
'response',recv)
72 # print(type(recv))
73 return recv
74
75 def opearte_cmd(self,cmd):
76 # print('12345')
77 # print(cmd,'&&&&&&&&')
78 if cmd
is None :
79 raise Exception(
'cmd cannot be null')
80 cmd_list =
cmd.split()
81 if cmd_list[0] ==
'get' and len(cmd_list) == 2
:
82 self._get(cmd)
83 return
84 if cmd_list[0] ==
'put' and len(cmd_list) == 2
:
85 if os.path.exists(cmd_list[1
]):
86 self._put(cmd)
87 return
88 if cmd_list[0] ==
'ls':
89 self._ls()
90 return
91 if cmd_list[0] ==
'exit':
92 exit()
93 else:
94 raise Exception(
'cmd is worry!please try again later!')
95
96 def get_FileSize(self,filePath):
97 fsize =
os.path.getsize(filePath)
98 # fsize = fsize / float(1024)
99 # return round(fsize, 2)
100 return fsize
101 def _get(self,cmd):
102 cmd_list =
cmd.split()
103 data =
{
104 'header': self.header,
105 'action':
'get',
106 'filename': cmd_list[1
]
107 }
108 recv =
self.sock.sendall(json.dumps(data).encode())
109 response =
self.get_response()
110 print(
'recv',response)
111
112 if response.get(
'code') == 200
:
113 file_size = response.get(
'file_size')
114 with open(cmd_list[1],
'wb') as f:
115 recv_size =
0
116 while recv_size <
int(file_size):
117 recv_data = self.sock.recv(1024
)
118 # print(recv_data)
119 recv_size +=
len(recv_data)
120 # print(recv_size)
121 f.write(recv_data)
122 self.sock.send(b
'1')
123 print(self.get_response())
124 return
125 else:
126 raise Exception(
'worry with server in get file .')
127
128
129 def _put(self,cmd):
130 cmd_list =
cmd.split()
131 filename = cmd_list[1].split(
'\\')[-1
]
132 print(cmd_list[1
])
133 file_size = self.get_FileSize(cmd_list[1
])
134 data =
{
135 'header': self.header,
136 'action':
'put',
137 'filename': filename,
138 'file_size':file_size
139 }
140 self.sock.sendall(json.dumps(data).encode())
141 recv =
self.get_response()
142 if recv.get(
'code') == 200
:
143 print(os.path.exists(cmd_list[1
]))
144 f = open(cmd_list[1],
'rb')
145 size =
0
146 for line
in f:
147 size +=
len(line)
148 # print(size)
149 # print(line)
150 self.sock.send(line)
151 self.sock.recv(1
)
152 f.close()
153 print(
'recv:',self.get_response())
154 return True
155 else:
156 msg =
{
157 'code':recv.get(
'code'),
158 'message': STATUS_CODE.get(recv.get(
'code'))
159 }
160 raise Exception(msg)
161
162 def _ls(self):
163 data =
{
164 'header': self.header,
165 'action':
'ls'
166 }
167 self.sock.sendall(json.dumps(data).encode())
168 print(
'recv:', self.get_response())
169 return True
170
171 #python FTP1\Client\client.py -H 127.0.0.1 -P 9001 -u alex -p 1234
172
173 def interactive(self):
174 if self.authenticate():
175 print(
'start interactive'.center(60,
'-'))
176 while True:
177 print(
'''
178 List of functions:
179 get : e.g:get XXX.txt,
180 put : e.g:put XXX.txt,
181 ls : e.g:ls
182 exit : e.g:exit
183 ''')
184 cmd = input(
"cmd>>>").strip()
185 self.opearte_cmd(cmd)
186 continue
187
188
189 #python FTP1\Client\client.py -H 127.0.0.1 -P 9001 -u alex -p 1234
190 # put C:\Users\Administrator\Desktop\noteForPython.txt
191 if __name__ ==
'__main__':
192 client =
FTPClient()
193 client.interactive()
client.py
1 import os,sys
2 base_dir = os.path.dirname(os.path.dirname(os.path.abspath(
__file__)))
3 sys.path.append(base_dir)
4
5 from core
import main
6
7 if __name__ ==
'__main__':
8 main.ArgvHandler()
server.py
1 import os,sys
2 base_dir = os.path.dirname(os.path.dirname(os.path.abspath(
__file__)))
3
4 USER_HOME =
'%s/home'%
(base_dir)
5 LOG_DIR =
'%s/log'%
(base_dir)
6 LOG_level =
'DEBUG'
7 ACCOUNT_FILE =
'%s/db/account.ini'%
(base_dir)
8
9 HOST =
'127.0.0.1'
10 PORT = 9001
settings.py
1 import socketserver,json,configparser,os,time
2
3 STATUS_CODE =
{
4 200 :
"操作成功",
5 601 :
'操作失败'
6 }
7 Base_dir = os.path.dirname(os.path.dirname(os.path.abspath(
__file__)))
8 from conf
import settings
9 class FTPHandler(socketserver.BaseRequestHandler):
10 def handle(self):
11 while True:
12 print(
"welcome to FTPHander-handle-whileTrue...")
13 self.data = self.request.recv(1024
).strip()
14 if self.data
is None:
15 print(
"Client is closed")
16 break
17 print(self.client_address[0])
18
19 data =
json.loads(self.data.decode())
20
21 if data.get(
'action') ==
'auth':
22 self._auth(data)
23 elif data.get(
'action')
in (
'put',
'get',
'ls'):
24 func = getattr(self,
'_%s'